【发布时间】:2019-02-21 10:27:34
【问题描述】:
ViewModel 中的可变 LiveData:
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)
}
Fragment 观察到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() 是徒劳的。奇怪的是,我所描述的这种行为直到最近才出现,但目前尚不清楚是什么变化导致了这些问题。
【问题讨论】:
-
你使用的是哪个版本的android.arch.lifecycle?
-
androidx.lifecycle:lifecycle-extensions:2.0.0
-
设置新值时,您的观察者是否处于活动状态?