为什么LiveData.getValue会返回null,除非观察者被调用?

问题描述 投票:0回答:1

我有一个 ViewModel 它的属性为 LiveData<UserData>,从Room数据库中读取。

其代码如下。

class UserDataViewModel(application: Application) : AndroidViewModel(application) {

    private val userDataDao: UserDataDao = AppDatabase.getInstance(application).dao()
    val userData: LiveData<UserData?> = userDataDao.getUserData()

}

在相关的活动中,我得到了一个视图模型的引用。

private val viewModel: UserDataViewModel by viewModels()

在该活动中,我需要获取视图模型的值。UserData 点击按钮时的数据。

private fun handleClick(view: View) {
    viewModel.userData.value?.let {
        // do stuff if the userData is present
    }
}

理论上讲,除非用户在数据加载之前按下按钮,否则这个值永远不会是空的。

然而,在代码中,对 viewModel.userData.value 始终为空,而 let 块永远不会执行。

但是 如果我在 onCreateజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ let 在点击处理程序中的块按要求执行:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel.userData.observe(this, Observer {
        // do nothing
    })
}

我的问题是:为什么我需要调用观察函数,即使我什么都不做的变化事件,以获得有效的响应从 LiveData::getValue?

android kotlin android-room android-lifecycle android-livedata
1个回答
3
投票

我的问题是:为什么我需要调用观察函数,即使我什么都不做的变化事件,也要从LiveData::getValue中获得有效的响应?

因为 ComputableLiveData 只有当LiveData至少有一个活跃的观察者时,才会执行从Room DAO返回的查询(在 LiveData.onActive()). 然后它在不同的线程上异步运行,在未来的某个时间点,它将被发布到LiveData中。


0
投票

你不需要调用 observe() 以便让LiveData放弃一个非null的值。 LiveData最初总是包含和产生null,直到有东西设置它的值。 如果你不想要这个初始的null值,那么在将LiveData提供给任何其他组件之前,你应该立即将其设置为其他值。 如果你想知道它什么时候第一次包含一个非空值,你将需要使用一个观察者。

© www.soinside.com 2019 - 2024. All rights reserved.