我正在通过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对象。
是同一对象。 _word
和word
都指向MutableLiveData
。但是,从数据类型的角度来看,word
被定义为LiveData
,以隐藏片段中的实现细节。
因此,观察者被放置在获取值更新的同一对象上。
就个人而言,我更喜欢将这段代码编写为:
private val _word = MutableLiveData<String>()
val word : LiveData<String> = _word
...就像恕我直言,它更易于阅读并且具有相同的效果。
关于android - 如何观察到的具有livetablelivedata支持属性的livedata在从未直接更新时如何触发观察者?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56193493/