【发布时间】:2020-07-15 19:32:35
【问题描述】:
我的ViewModel 在协程中通过Room 加载数据:
// ViewModel:
lateinit var items : LiveData<List<Item>>
private set
init {
viewModelScope.launch(IO) {
items = MyDatabase.getInstance(MyApplication.getContext()).itemsDao.getAllItems()
}
}
// Fragment:
viewModel.items.observe(viewLifecycleOwner, Observer {
it?.let {
adapter.submitList(it)
}
})
这导致
kotlin.UninitializedPropertyAccessException: lateinit property items has not been initialized
我了解这个错误 - Fragment 在协程完成之前尝试访问 items 属性,很好。
但是我该如何解决呢?如何观察协程在稍后时间点实际提供的ViewModel 的数据?请注意,我希望我的查询 itemsDao.getAllItems() 保持挂起功能(没有 UI 冻结)。
【问题讨论】:
-
所以
getAllItems()返回LiveData?如果您的getAllItems()返回LiveData,您为什么还要这样做viewModelScope.launch(IO)?LiveData返回的 Dao 方法不需要在任何调度程序上运行。 -
伊恩,谢谢。没有什么特别的原因,我是新手,确实混淆了一些东西。它可以正常工作而无需添加另一个协程范围。请张贴作为答案。你知道
LiveData重调方法在内部使用的是哪个协程范围吗?
标签: android kotlin android-room kotlin-coroutines android-viewmodel