3

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

尽管观察者在 livedata 实例而不是 mutablelivedata 实例上,但当 mutablelivedata 对象更新时,将触发 livedata 观察者代码。我喜欢它像这样工作,但我不完全理解它是如何工作的。谁能给我解释一下?

在视图模型中

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
        })
4

1 回答 1

4

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

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

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

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

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

...作为恕我直言,更易于阅读并具有相同的效果。

于 2019-05-17T21:05:25.457 回答