首页 > 解决方案 > 在 Fragment 之间共享 ViewModel 或在 ViewModel 之间共享 LiveData

问题描述

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

我的场景:

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

FragmentAViewModelAFragmentBViewModelB

ViewModelALiveDataA1ViewModelBLiveDataB1LiveDataB2

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

问题是我FragmentALiveDataB2ViewModelB.

方法#1:

除了ViewModelA,ViewModelB也用于FragmentA(所以它就像 FragmentA 中的 2 个 ViewModel)。所以会从FragmentA观察。LiveDataB2ViewModelB

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

方法#2:

创建一个新的SharedViewModel. 所以我们现在将有 3 个 ViewModel: ViewModelAhas LiveDataA1ViewModelBhas LiveDataB1SharedViewModelhas LiveDataB2。(这里我LiveDataB2ViewModelBSharedViewModel

除了ViewModelA,SharedViewModel也可以用在FragmentA. 所以 FragmentA 将从LiveDataB2观察SharedViewModel

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

方法#3:

在 ViewModel 之间共享 LiveData。我认为这很疯狂,我不知道如何实现。但我认为会有一个 new LiveDataA2inViewModelA指代与in相同的实例LiveDataB2ViewModelB

所以FragmentA只会有ViewModelA并且可以观察LiveDataA2。如果有变化LiveDataB2ViewModelB就会FragmentA有。

非常需要一些建议这里正确的方法!

标签: androidmvvmandroid-livedataandroid-viewmodel

解决方案


共享 ViewModel是正确的方法

Shared ViewModel您应该对两个片段FragmentAFragmentB多个实时数据对象使用单个LiveDataA1LiveDataB1并且LiveDataB2通过这种方法您FragmentA可以轻松观察LiveDataB2

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

方法#1:

如果FragmentA创建一个实例,ViewModelB您将不会ViewModelBFragmentB因此ViewModelB失去其状态相关联。

方法#2:

ViewModel不知何故,当有推荐的方式时,您正在单独创建,即Shared ViewModel按照官方文档

方法#3:

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


推荐阅读