我有一个 ViewModel
它具有 LiveData<UserData>
类型的属性,正在从 Room 数据库中读取。
其代码如下:
class UserDataViewModel(application: Application) : AndroidViewModel(application) {
private val userDataDao: UserDataDao = AppDatabase.getInstance(application).dao()
val userData: LiveData<UserData?> = userDataDao.getUserData()
}
在关联的 Activity 中,我获得了对 View 模型的引用:
private val viewModel: UserDataViewModel by viewModels()
在该 Activity 中,我需要获取 UserData
的值单击按钮:
private fun handleClick(view: View) {
viewModel.userData.value?.let {
// do stuff if the userData is present
}
}
现在理论上,除非用户在数据加载之前按下按钮,否则它永远不应该为 null。
但是,就代码而言,对 viewModel.userData.value
的调用始终为空,let
block 永远不会执行。
但是,如果我在 onCreate
中添加这条语句, let
点击处理程序中的 block 根据需要执行:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.userData.observe(this, Observer {
// do nothing
})
}
我的问题是:为什么我需要调用 observe 函数来从 LiveData::getValue
获得有效响应,即使我对更改事件什么也不做? ?
最佳答案
My question is: why do I need to call the observe function, even if I'm doing nothing with a change event, to get valid responses from LiveData::getValue?
因为从 Room DAO 返回的 ComputableLiveData
只有在 LiveData 有至少一个活跃的观察者(在 LiveData.onActive()
内)时才会执行查询。然后它在不同的线程上异步运行,并在将来的某个时候将它发布到 LiveData 中。
关于android - 为什么 LiveData.getValue 除非调用 observe 才会返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61565175/