Comment utiliser la liaison bidirectionnelle dans viewModel

Sep 02 2020

J'en ai un EditTextdans mon fragment, je veux lier dans les deux sens la valeur de texte de EditTextavec la variable de viewModel, afin que je puisse obtenir cette valeur de texte dans viewModel pour faire un travail supplémentaire.

VoirModèle:

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>

Réponses

1 aminography Sep 02 2020 at 18:51

Il vous suffit de définir namecomme un fichier MutableLiveData. Ainsi, tous les changements de texte du EditTextsont reflétés sur celui-ci et vous pourrez lire la valeur buttonSubmitcomme suit: (votre xmlcontenu est correct)

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 ?: "")
        }
    }
}