我正在通过udacity关注Google android项目“猜测”,他们引入了livedata和mutablelivedata。我们已经到了创建与mutablelivedata对象等效的livedata的位置,并为livedata创建了对mutablelivedata实例的get()支持属性。我们使用mutablelivedata实例对viewModel中的数据进行所有更改。我们的UI片段在viewModel的livedata对象上设置观察者,而不是mutablelivedata对象。

尽管观察者是在livedata实例上,而不是在mutablelivedata实例上,但当更新mutablelivedata对象时,将触发livedata观察者代码。我喜欢它的工作原理,但我不完全了解它的工作原理。有人可以向我解释吗?

在ViewModel中

val _word = MutableLiveData<String>()
val word : LiveData<String>
        get() = _word


在ViewModel中编辑

private fun nextWord() {
    //Select and remove a word from the list
    if (wordList.isEmpty()) {
        //gameFinished()
    } else {
        _word.value = wordList.removeAt(0)
    }
}


在UI片段中

viewModel.word.observe(this, Observer{newWord ->
            binding.wordText.text = newWord
        })

最佳答案

我们的UI片段在viewModel的livedata对象上设置观察者,而不是mutablelivedata对象。


是同一对象。 _wordword都指向MutableLiveData。但是,从数据类型的角度来看,word被定义为LiveData,以隐藏片段中的实现细节。

因此,观察者被放置在获取值更新的同一对象上。

就个人而言,我更喜欢将这段代码编写为:

private val _word = MutableLiveData<String>()
val word : LiveData<String> = _word


...就像恕我直言,它更易于阅读并且具有相同的效果。

关于android - 如何观察到的具有livetablelivedata支持属性的livedata在从未直接更新时如何触发观察者?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56193493/

10-12 02:36