如何观察到的具有livetablelivedata支持属性的livedata在从未直接更新时如何触发观察者?

时间:2019-05-17 20:58:05

标签: android android-livedata mutablelivedata

我通过udacity关注Google android项目“猜测”,他们引入了livedata和mutablelivedata。至此,我们正在创建一个等效于mutablelivedata对象的livedata,并为该livedata创建一个get()backingproperty属性到mutablelivedata实例。我们使用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)
    }
}

在用户界面片段中

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

1 个答案:

答案 0 :(得分:1)

  

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

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

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

我个人更喜欢将此代码编写为:

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

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