Я смотрел этот потрясающий разговор Флорины Мунтенеску на KontlinConf 2018, где она рассказывала о том, как они изменили архитектуру своего приложения.
Одна часть разговора была о том, как они раскрывают UiModel ( не ) ViewModel) через LiveData из ViewModel. ( смотреть здесь )
Она сделала пример, подобный этому:
class MyViewModel constructor(...) : ViewModel() {
private val _uiModel = MutableLiveData<UiModel>()
val uiModel: LiveData<UiModel>
get() = _uiModel
}
Объявление представления для ViewModel выше может быть:
<layout>
<data>
<variable
name="viewModel"
type="com.demo.ui.MyViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout>
<EditText
android:id="@+id/text"
android:text="@={viewModel.uiModel.text}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Она не говорила (или я пропустил это), как они реагируют на изменения свойств в самой UiModel. Как я могу выполнять функцию каждый раз, когда текст изменяется?
Имея текст в отдельном свойстве LiveData в ViewModel, я мог бы использовать MediatorLiveData для это как:
myMediatorLiveData.addSource(text){
// do something when text changed
}
Но при использовании подхода, описанного выше, UiModel не меняется, а изменяются его значения. Так что это здесь не работает:
myMediatorLiveData.addSource(uiModel){
// do something when text inside uiModel changed
}
Итак, мой вопрос как я могу реагировать на изменения внутри UiModel в ViewModel с помощью этого подхода?
Спасибо за совет, Крис