距离最初的帖子已经有一段时间了,但我最近偶然发现了同样的问题(也与 Firebase 相关),我能够通过转换解决它。
我有一个存储库类,其中包含使用 Firebase 的 ValueEventListener 收集的 liveData 对象。
ViewModel 持有对此存储库的引用。
现在,在 ViewModel 中,不再使用从存储库返回 LiveData 值的函数,然后通过观察者将其传递给 Fragment,如下所示:
fun getMyPayments(): LiveData<HashMap<String, Int>> {
return repository.provideMyPayments()
}
在被 ViewModel 中的另一个函数处理后,我使用一个带有 Transformations.map 的 val 来表示 LiveData 的最终结果:
val myRoomPaymentsList : LiveData<HashMap<String, HashMap<String, Payment>>> = Transformations.map(repository.provideMyPayments()) {data ->
getRoomPaymentsList(data)
}
注意第一个参数是你观察到的数据源,第二个参数是你想要得到的结果。
此 val 是一个 LiveData val,它保存存储库中的最新值并根据需要在 Fragment 中提供它,将所有处理保留在 ViewModel 中,并且仅将 UI 函数保留在 Framgent 本身中。
然后,在我的 Fragment 中,我在这个 val 上放置了一个观察者:
viewModel.myRoomPaymentsList.observe(viewLifecycleOwner, {
roomPayments = it
graphFilterPeriod()
})