Как правильно использовать двустороннюю привязку в Kotlin-мультиплатформенный?

#android #kotlin #data-binding #kotlin-multiplatform #2-way-object-databinding

#Android #котлин #привязка данных #kotlin-мультиплатформенный #2-way-object-databinding

Вопрос:

Я пытаюсь использовать String переменную, чтобы привязать ее к моему представлению. Когда я использую объект модели со String свойством, он работает хорошо. Но если я использую String только переменную, она работает только с односторонней привязкой.

Модель представления:

 class SampleModel(var data : String = "")

var myModel : SampleModel = SampleModel()
var myVariable : String = ""
 

XML:

 <data>
   <variable
        name="model"
        type="MyViewModel.SampleModel" />

   <variable
        name="variable"
        type="String" />
</data>

<!-- Two way works fine -->
<EditText
    android:text="@={model.data}"/>


<!-- Only one way works -->
<EditText
    android:text="@={variable}"/>
 

Строка в SampleModel хорошо работает с двусторонней привязкой, но String переменная этого не делает.

Я думаю , это потому , что импортированное String в xml есть java.lang.String , а String в модели есть kotlin.String . И я не могу использовать kotlin.String in xml.

Есть ли какое-либо решение для исправления этого? Или есть какой-нибудь правильный способ двусторонней привязки в Kotlin-Multiplatform проектах?

Ответ №1:

Похоже, вы добавили неправильную переменную в XML-файл. В вашей модели представления вы создали переменную с именем myVariable типа String , но в вашем xml файле вы создаете здесь еще одну переменную :-

  <variable
    name="variable"
    type="String" />
 

итак, эти обе переменные разные. Вам не нужно ничего импортировать в свой xml файл, просто создайте viewModel переменную, которую вы уже сделали здесь :-

 <variable
    name="model"
    type="MyViewModel.SampleModel" />
 

а теперь просто используйте это, как :- android:text="@={model. myVariable}"

ОБНОВЛЕНИЕ: — Здесь в этом вам нужно использовать String переменную, которую я создал в вашем viewModel , потому что она используется kotlin.String и у xml вас есть java.lang.String . Вы можете просто использовать переменную, которая создается в вашем viewModel For, например :- android:text="@={viewModel.yourVariable}"

Комментарии:

1. Я просто опустил ту часть , в которой я связываю viewmodel и xml следующим образом: binding.setVariable(BR.model,viewmodel.myModel) и binding.setVariable(BR.variable,viewmodel.myVariable) . Как я уже сказал в своем вопросе, оба способа работают при односторонней привязке. так что в этой ссылке нет ничего плохого. Также вторая часть, о которой вы упомянули, не является viewmodel , это переменная в моем viewmodel типе SimpleModel .

2. Я только что попробовал с обычной строкой, и она работает с двусторонней привязкой. Кроме того, вам не нужно устанавливать разные переменные, вместо этого вы можете просто привязать свой класс ViewModel, например:- binding.setVariable(BR.viewModel,viewmodel) . а затем используйте его в своем xml с вашей переменной like viewModel.yourStringVariable , и он должен работать нормально

3. Вы правы. Доступ string к тому, что создано в классе Kotlin, прекрасно работает с двусторонней привязкой. Точно так же, как класс, который я создал в my viewmodel и использовал его в my xml . Потому что он использует kotlin.String вместо java.lang.String . Похоже, нет способа сделать java.lang.String привязку. Пожалуйста, отредактируйте свой ответ, чтобы я мог поддержать его.

4. Обновил свой ответ. Пожалуйста, примите и проголосуйте, чтобы другие могли легко его найти.