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