【问题标题】:Share ViewModels between fragments OR share LiveData between ViewModels在 Fragment 之间共享 ViewModel 或在 ViewModel 之间共享 LiveData
【发布时间】:2020-03-22 04:44:31
【问题描述】:

基本上我想要一种方法来正确在片段之间共享 ViewModel 或在 ViewModel 之间共享 LiveData。

我的场景:

我有 2 个片段(FragmentAFragmentB) - 每个片段都有自己的 ViewModel:

FragmentAViewModelAFragmentBViewModelB

ViewModelALiveDataA1ViewModelBLiveDataB1LiveDataB2

ViewModelB 只允许拥有LiveDataB2ViewModelA 不能拥有。

问题是我想让FragmentAViewModelB观察LiveDataB2

方法#1:

除了ViewModelAViewModelB 也用于FragmentA(所以它就像 FragmentA 中的 2 个 ViewModel)。 所以FragmentA 将从ViewModelB 观察LiveDataB2

这是我现在的当前实现。但我觉得拥有另一个用于其他片段的 ViewModel 是不合适的。 我认为每个 Fragment 应该只有 1 个 ViewModel。

方法#2:

创建一个新的SharedViewModel。 所以我们现在将有 3 个 ViewModel: ViewModelALiveDataA1ViewModelBLiveDataB1SharedViewModelLiveDataB2。 (这里我把LiveDataB2ViewModelB移动到SharedViewModel

除了ViewModelASharedViewModel 也用于FragmentA。 所以 FragmentA 将从SharedViewModel 观察LiveDataB2

所以我猜它与#1 相同,但我想但在这里我认为SharedViewModel 只是一个实用 ViewModel,就像获取所需的共享数据一样。 所以在这里我们就像把所有可以在 FragmentA 和 FragmentB 之间(甚至与其他 Fragment)公共/共享的 LiveDatas 放在一起

方法#3:

在 ViewModel 之间共享 LiveData。 我认为这很疯狂,我不知道如何实现。 但我认为ViewModelA 中会有一个新的LiveDataA2,它指的是与ViewModelB 中的LiveDataB2 相同的实例

所以FragmentA 将只有ViewModelA 并且可以观察LiveDataA2。 如果ViewModelB中的LiveDataB2有变化,FragmentA会有变化。

这里非常需要一些建议,以了解哪种方法正确!

【问题讨论】:

  • 恕我直言方法#2 是观察来自多个片段的实时数据的最佳方法
  • 我不确定这是否是不好的做法,但我已经成功实现了您的第一种方法,多个片段具有多个 SharedViewModel,甚至 5 个片段使用相同的 ViewModel 实例,单个片段使用最多 3 个 ViewModel 实例,到目前为止没有任何问题。

标签: android mvvm android-livedata android-viewmodel


【解决方案1】:

Shared ViewModel 是正确的方法

您应该为片段FragmentAFragmentB 使用单个Shared ViewModel,并使用多个实时数据对象LiveDataA1LiveDataB1LiveDataB2,通过这种方法,您的FragmentA 可以轻松观察@987654329 @。

现在,您的方法的问题是:

方法#1:

如果FragmentA 创建了ViewModelB 的实例,您将无法获得ViewModelBFragmentB 关联,因此ViewModelB 失去了它的状态。

方法#2:

根据官方文档,如果有推荐的方式,即 Shared ViewModel,您正在创建单独的 ViewModel,不知何故

方法#3:

共享LiveData 对象不是正确的方法,因为它与生命周期所有者相关联。

【讨论】:

  • [如果 FragmentA 创建了 ViewModelB 的实例,您将不会让 ViewModelB 与 FragmentB 关联,因此 ViewModelB 失去其状态] 在这种情况下,ViewModelB 是共享的。我的方法#2 已经在使用推荐的方式
  • @iori24 是的,你可以用它,如果不需要其他视图模型那么你应该只使用Shared ViewModel
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2019-07-02
  • 2010-11-12
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多