android - 在 Fragment 之间共享 ViewModel 或在 ViewModel 之间共享 LiveData
问题描述
基本上我想要一种在片段之间正确共享 ViewModel 或在 ViewModel 之间共享 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 个 ViewModel)。所以会从FragmentA
观察。LiveDataB2
ViewModelB
这是我现在的当前实现。但我觉得拥有另一个用于其他片段的 ViewModel 是不合适的。我认为每个片段应该只有 1 个 ViewModel。
方法#2:
创建一个新的SharedViewModel
. 所以我们现在将有 3 个 ViewModel:
ViewModelA
has LiveDataA1
、ViewModelB
has LiveDataB1
、SharedViewModel
has LiveDataB2
。(这里我LiveDataB2
从ViewModelB
到SharedViewModel
)
除了ViewModelA
,SharedViewModel
也可以用在FragmentA
. 所以 FragmentA 将从LiveDataB2
观察SharedViewModel
。
所以我猜它与#1 相同,但我想但在这里我认为这SharedViewModel
只是一个 util ViewModel,就像获取所需的共享数据一样。所以在这里我们就像把所有可以在 FragmentA 和 FragmentB 之间共享/共享的 LiveDatas(甚至与其他 Fragment)
方法#3:
在 ViewModel 之间共享 LiveData。我认为这很疯狂,我不知道如何实现。但我认为会有一个 new LiveDataA2
inViewModelA
指代与in相同的实例。LiveDataB2
ViewModelB
所以FragmentA
只会有ViewModelA
并且可以观察LiveDataA2
。如果有变化LiveDataB2
,ViewModelB
就会FragmentA
有。
非常需要一些建议这里正确的方法!
解决方案
共享 ViewModel是正确的方法
Shared ViewModel
您应该对两个片段FragmentA
和FragmentB
多个实时数据对象使用单个LiveDataA1
, LiveDataB1
并且LiveDataB2
通过这种方法您FragmentA
可以轻松观察LiveDataB2
。
现在,您的方法的问题是:
方法#1:
如果FragmentA
创建一个实例,ViewModelB
您将不会ViewModelB
与FragmentB
因此ViewModelB
失去其状态相关联。
方法#2:
ViewModel
不知何故,当有推荐的方式时,您正在单独创建,即Shared ViewModel
按照官方文档
方法#3:
共享LiveData
对象不是正确的方法,因为它与生命周期所有者相关联。
推荐阅读
- reactjs - 在 react onClick 上激活 2 个不同的调用
- netlogo - 计算邻居之间海龟的步数
- excel - 用于检查值是否存在的 Excel 公式,否则不显示任何内容 - 也使用条件格式
- shopify - 如何在 shopify 中创建自定义 webhook
- python - Python Pandas 隔夜数据分组
- jitsi - Jitsi 配置大厅
- javascript - 不使用 HTML 的打字效果 JS
- elasticsearch - ElasticSearch 504 网关超时
- r - r 中的统计检验以显示组间的显着差异
- python - IntelliSense 仅适用于某些 Jupyter Notebooks 但并非全部适用 - VS Code