以 mutablelivedata 为后盾 属性 的 observed livedata 如何知道在从未直接更新时触发观察者?

How does observed livedata with a backing property of mutablelivedata know to trigger observers when never directly updated?

我正在通过 udacity 关注 google android 项目 "guess it",他们在其中引入了 livedata 和 mutablelivedata。我们已经到了这样的地步,我们正在创建一个等效于 mutablelivedata 对象的 livedata 并为 mutablelivedata 实例的 livedata 创建一个 get() backingproperty。我们使用 mutablelivedata 实例对 viewModel 中的数据进行所有更改。我们的 UI 片段在 viewModel 的 livedata 对象上设置观察者,而不是可变的 livedata 对象。

尽管观察者在 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
        })

Our UI Fragment sets observers on the viewModel's livedata objects, NOT the mutablelivedata objects.

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

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

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

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

...恕我直言,更易于阅读且效果相同。