在片段之间共享ViewModel或在ViewModel之间共享LiveData

时间:2020-03-22 04:44:31

标签: android mvvm android-livedata android-viewmodel

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

我的情况:

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

FragmentAViewModelAFragmentBViewModelB

ViewModelALiveDataA1ViewModelBLiveDataB1LiveDataB2

ViewModelB只允许拥有LiveDataB2,而ViewModelA不能拥有。

问题是我希望FragmentA观察LiveDataB2中的ViewModelB

方法#1:

除了ViewModelA之外,ViewModelB也用在FragmentA中(因此就像FragmentA中的2个ViewModels一样)。 因此FragmentA将从LiveDataB2观察ViewModelB

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

方法2:

创建一个新的SharedViewModel。 因此,我们现在将拥有3个ViewModel: ViewModelALiveDataA1ViewModelBLiveDataB1SharedViewModelLiveDataB2。 (在这里,我将LiveDataB2ViewModelB移到SharedViewModel

除了ViewModelA之外,SharedViewModel也用在FragmentA中。 因此,FragmentA将观察LiveDataB2中的SharedViewModel

所以我想它和#1一样,但是我想在这里我想SharedViewModel只是一个ViewView工具,就像获取所需的共享数据一样。 所以在这里,我们就像放置了所有可以在FragmentA和FragmentB(甚至与其他片段)之间共享/共享的LiveDatas

方法3:

在ViewModel之间共享LiveData。 我认为这太疯狂了,我不知道如何实现。 但是我在想LiveDataA2中将有一个新的ViewModelA,它与LiveDataB2中的ViewModelB引用同一实例。

因此,FragmentA仅具有ViewModelA,并且可以观察LiveDataA2。 如果LiveDataB2中的ViewModelB中有更改,FragmentA会拥有它。

在这里几乎需要一些建议,以正确的方式使用!

1 个答案:

答案 0 :(得分:0)

Shared ViewModel是正确的方法

对于片段Shared ViewModelFragmentA,应使用一个单独的FragmentB和多个实时数据对象LiveDataA1LiveDataB1LiveDataB2,通过这种方法,您的FragmentA可以轻松观察LiveDataB2

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

方法#1:

如果FragmentA创建了ViewModelB的实例,您将不会与ViewModelB关联FragmentB,因此ViewModelB会失去状态。

方法2:

问题在于,如果有推荐的方法,即根据官方文档,ViewModel,您将创建单独的Shared ViewModel

方法3:

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

相关问题