基本上,我想要一种正确在片段之间共享ViewModel或在ViewModels之间共享LiveData的方法。
我的情况:
我有2个片段(FragmentA
和FragmentB
)-每个片段都有自己的ViewModel:
FragmentA
有ViewModelA
,FragmentB
有ViewModelB
。
ViewModelA
有LiveDataA1
,ViewModelB
有LiveDataB1
和LiveDataB2
ViewModelB
只允许拥有LiveDataB2
,而ViewModelA
不能拥有。
问题是我希望FragmentA
观察LiveDataB2
中的ViewModelB
。
方法#1:
除了ViewModelA
之外,ViewModelB
也用在FragmentA
中(因此就像FragmentA中的2个ViewModels一样)。
因此FragmentA
将从LiveDataB2
观察ViewModelB
。
这是我目前的实现方式。但是我觉得拥有另一个用于其他片段的ViewModel是不合适的。 我认为每个Fragment应该只有1个ViewModel。
方法2:
创建一个新的SharedViewModel
。
因此,我们现在将拥有3个ViewModel:
ViewModelA
有LiveDataA1
,ViewModelB
有LiveDataB1
,SharedViewModel
有LiveDataB2
。
(在这里,我将LiveDataB2
从ViewModelB
移到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
会拥有它。
在这里几乎需要一些建议,以正确的方式使用!
答案 0 :(得分:0)
Shared ViewModel是正确的方法
对于片段Shared ViewModel
和FragmentA
,应使用一个单独的FragmentB
和多个实时数据对象LiveDataA1
,LiveDataB1
和LiveDataB2
,通过这种方法,您的FragmentA
可以轻松观察LiveDataB2
。
现在,您的方法存在的问题是:
方法#1:
如果FragmentA
创建了ViewModelB
的实例,您将不会与ViewModelB
关联FragmentB
,因此ViewModelB
会失去状态。
方法2:
问题在于,如果有推荐的方法,即根据官方文档,ViewModel
,您将创建单独的Shared ViewModel
方法3:
共享LiveData
对象不是正确的方法,因为它与生命周期所有者相关联。