Изменяемые LiveData в ViewModel
:
val viewStateLiveData: MutableLiveData<SomeViewState> = MutableLiveData()
Когда сетевой вызов терпит неудачу, эта функция (в ViewModel
) вызывается из основного потока для обновления объекта состояния представления (для отображения Snackbar, но затем сбрасывает состояние, чтобы оно не отображалось повторно):
@UiThread
private fun onFailure() {
viewStateLiveData.value = viewStateLiveData.value?.copy(retrievalSuccess = false, showProgress = false)
viewStateLiveData.value = viewStateLiveData.value?.copy(retrievalSuccess = null)
}
Фрагмент наблюдает за MutableLiveData
:
viewModel.viewStateLiveData.observe(this, Observer { viewState ->
Timber.i("Update ViewState: $viewState")
})
Но результатом является этот единственный вызов наблюдателя (представляющий вторую мутацию):
Update ViewState: ViewState(retrievalSuccess=null, showProgress=false)
Вместо того, что я ожидал, что было бы двумя вызовами наблюдателя, отражающими обе мутации:
Update ViewState: ViewState(retrievalSuccess=false, showProgress=false)
Update ViewState: ViewState(retrievalSuccess=null, showProgress=false)
Почему MutableLiveData.setValue()
не запускает наблюдателя после обеих мутаций? В документах говорится: «Устанавливает значение. Если есть активные наблюдатели, значение будет отправлено им». но трудно не сделать вывод, что это не так, поскольку setValue() вызывается, но наблюдатель (который активен) не запускается. Наблюдатель определенно настроен до MutableLiveData
мутаций.
Я экспериментировал с серией мутаций и вижу только один вызов наблюдателя, который получает объект состояния представления, объединяющий все предыдущие мутации. Таким образом, вызовы setValue()
изменяют состояние представления, но только последний вызов в серии запускает наблюдателя.
Я пытался использовать postValue()
напрасно. Как ни странно, такого поведения, которое я описываю, не было до недавнего времени, но неясно, что изменилось, что вызвало эти проблемы.