当前位置: 首页 > 知识库问答 >
问题:

支持属性为mutablelivedata的观察到的livedata如何知道在从未直接更新时触发观察者?

申屠昆
2023-03-14

我正在通过udacy跟踪谷歌Android项目“猜猜看”,他们在那里引入了livedata和Mutablelivedata。我们已经到了这样一个地步,我们正在创建一个相当于Mutablelivedata对象的livedata,并为livedata创建一个get()Backing属性到Mutablelivedata实例。我们使用Mutablelivedata实例对视图模型中的数据进行所有更改。我们的用户界面片段将观察者设置在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
        })

共有1个答案

鲁泰宁
2023-03-14

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

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

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

就我个人而言,我更喜欢这样写代码:

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

...和IMHO一样,它更容易阅读,也有同样的效果。

 类似资料:
  • 试图让LiveData与Room一起工作: 因为我观察到tdao.getall(),所以我希望在我的活动中,当同步完成时,它会刷新日历。现在,您必须重新加载该活动,以获取在执行同步后放入数据库的数据。我对Room和LiveData很陌生。有什么想法吗?希望我没有拿出太多的代码,这是从一个相当大的应用程序到目前为止。

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 在livedata的observe方法中有这样一条评论 在给定所有者的生命周期内将给定的观察者添加到观察者列表中。事件在主线程上分派。如果LiveData已经有数据集,它将传递给观察者。 当我尝试向现有livedata实例添加新的观察者时,如果livedata具有数据集,则new观察者的onChanged方法调用。 有什么办法可以避免这种行为吗?我只是不想被通知新的观察员 SingleLiveEv

  • 我有一个视图模型,从场景中接收流作为livedata 在活动中,我们订阅了这个livedata,一些逻辑发生并使用了activityResult 当我们返回时,我们会用最后一个状态触发一个观察者,并再次执行之前的导航逻辑 如何忽略返回时具有相同值的观察者触发器?

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 我尝试使用这个实现ViewModel。但观察者从未被调用。 基本上,这个应用程序在SAMPLE_URL上发出网络请求,将JSON转换为列表,并通过BookView显示列表。这个应用程序在没有ViewModel的情况下工作得很好。使用ViewModel,应用程序会运行,但Observer从未被调用,也没有显示任何数据。 我在这里做错了什么? BookActivity类: BookViewModel类