Как использовать двустороннюю привязку в ViewModel

#android #kotlin #android-databinding #android-viewmodel #two-way-binding

#Android #kotlin #android-привязка к данным #android-viewmodel #двусторонняя привязка

Вопрос:

У меня есть один EditText в моем фрагменте, я хочу двустороннюю привязку текстового значения EditText к переменной ViewModel, чтобы я мог получить это текстовое значение в ViewModel для выполнения дополнительной работы.

ViewModel:

 class MyViewModel @ViewModelInject constructor(
    private val myRepository: MyRepository,
    private val myPreferences: MyPreferences
) : ViewModel() {

    val name = myPreferences.getStoredName()

    fun buttonSubmit() {
        viewModelScope.launch(Dispatchers.IO) {
            myPreferences.setStoredName(name)
            val response = myRepository.doSomething(name)  // I can get the text value by name variable
    }
}
  

xml:

 <layout ...>

    <data>
        <variable
            name="viewModel"
            type=".MyViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        ...>

        <EditText
            ...
            android:text="@={viewModel.name}" />  <!-- how to two-way binding name -->

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
  

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

1. Не забудьте добавить полное имя пакета, включая имя ViewModel, в XML-файл. Например, если ваша ViewModel хранится в «package com.example. YOURVIEWMODELNAME» ваш тип xml должен быть «com.example. YOURVIEWMODELNAME»

Ответ №1:

Вам просто нужно определить name как MutableLiveData . Таким образом, все текстовые изменения EditText будут отражены в нем, и вы сможете прочитать значение в buttonSubmit следующем виде: (ваш xml контент правильный)

 class MyViewModel @ViewModelInject constructor(
    private val myRepository: MyRepository,
    private val myPreferences: MyPreferences
) : ViewModel() {

    val name = MutableLiveData(myPreferences.getStoredName())

    fun buttonSubmit() {
        viewModelScope.launch(Dispatchers.IO) {
            myPreferences.setStoredName(name.value ?: "")
            val response = myRepository.doSomething(name.value ?: "")
        }
    }
}