【问题标题】:How can I share LiveData between multiple ViewModels?如何在多个 ViewModel 之间共享 LiveData?
【发布时间】:2019-03-27 00:34:31
【问题描述】:

我尝试将值提取到基类中并让 ViewModel 对其进行扩展。但是,当我这样做时,观察者不会坚持使用 LiveData。例如,当我有一个带有 LiveData 的父类时:

class Base : ViewModel() { 
    private val _ data = MutableLiveData()
    val data: LiveData = _data

    fun someEvent(foo: Foo) { // update _data }
}

class Derived : Base()

class Derived1 : Base()

然后获取其中一个 ViewModel 并观察 data

class Frag : Fragment {
    onViewCreated() {
        // get Derived, ViewModelProviders.of ...etc
       derived.data.observe { // Doesn't observe changes }
    }
}

调用 Base.someEvent(foo) 不会通知 Fragment 中的 LiveData。

我想避免引用两个子类并在每个子类上调用someEvent。需要注意的一点是,我使用的是单个 Activity 方法,并且所有 ViewModel 都是 Activity 范围的。

【问题讨论】:

标签: android kotlin android-architecture-components android-livedata


【解决方案1】:
class Derived : Base()

class Derived1 : Base()

有自己的实例:

private val _ data = MutableLiveData()
val data: LiveData = _data

这意味着你需要

derived.data.observe { // do something }
derived1.data.observer { // do something }
derived.someEvent(someFoo)
derived1.someEvent(someFoo)

你试图以错误的方式实现某事。

【讨论】:

  • 我在多个(但不是全部)片段上有一个浮动操作按钮。理想的做法是简单地将具有当前位置的单击侦听器发送到所有相关片段,而不是为每个片段设置一个单击侦听器。
  • 我不明白你能解释一下吗?
  • 我的活动有多个片段,有些有 FAB。单击 FAB 时,我希望发生一些上下文操作(很大程度上取决于屏幕,但也有其他因素)。我觉得在每个片段中执行 activity.fab.onclick() 会破坏封装。
  • 然后将 onClick 委托给片段。我不明白为什么你不能将 onClick 逻辑放在片段中。
  • 所以我们不能抽象 LiveData 的?
猜你喜欢
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2019-07-02
  • 2010-11-12
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多