以 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.
是同一个对象。 _word
和 word
都指向 MutableLiveData
。但是,从数据类型的角度来看,word
被定义为 LiveData
,以隐藏片段的实现细节。
因此,观察者被放置在获取值更新的同一个对象上。
就个人而言,我更喜欢将此代码编写为:
private val _word = MutableLiveData<String>()
val word : LiveData<String> = _word
...恕我直言,更易于阅读且效果相同。
我正在通过 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.
是同一个对象。 _word
和 word
都指向 MutableLiveData
。但是,从数据类型的角度来看,word
被定义为 LiveData
,以隐藏片段的实现细节。
因此,观察者被放置在获取值更新的同一个对象上。
就个人而言,我更喜欢将此代码编写为:
private val _word = MutableLiveData<String>()
val word : LiveData<String> = _word
...恕我直言,更易于阅读且效果相同。