【发布时间】:2020-03-22 04:44:31
【问题描述】:
基本上我想要一种方法来正确在片段之间共享 ViewModel 或在 ViewModel 之间共享 LiveData。
我的场景:
我有 2 个片段(FragmentA 和 FragmentB) - 每个片段都有自己的 ViewModel:
FragmentA 有ViewModelA,FragmentB 有ViewModelB。
ViewModelA 有LiveDataA1,ViewModelB 有LiveDataB1 和LiveDataB2
ViewModelB 只允许拥有LiveDataB2,ViewModelA 不能拥有。
问题是我想让FragmentA从ViewModelB观察LiveDataB2。
方法#1:
除了ViewModelA,ViewModelB 也用于FragmentA(所以它就像 FragmentA 中的 2 个 ViewModel)。
所以FragmentA 将从ViewModelB 观察LiveDataB2。
这是我现在的当前实现。但我觉得拥有另一个用于其他片段的 ViewModel 是不合适的。 我认为每个 Fragment 应该只有 1 个 ViewModel。
方法#2:
创建一个新的SharedViewModel。
所以我们现在将有 3 个 ViewModel:
ViewModelA 有LiveDataA1,ViewModelB 有LiveDataB1,SharedViewModel 有LiveDataB2。
(这里我把LiveDataB2从ViewModelB移动到SharedViewModel)
除了ViewModelA,SharedViewModel 也用于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