【问题标题】:Use viewmodel for a fragment called twice对被调用两次的片段使用视图模型
【发布时间】:2021-12-31 15:36:10
【问题描述】:

我的导航如下:

FragmentList -> FragmentDetailA -> FragmentDetailB -> FragmentDetailC

我使用 viewModel 作为细节 FragmentDetailViewModel

private val detailViewModel: DetailViewModel by activityViewModels()

但是如果我向前走,然后向后走,上面的 fragmentDetails 就会改变。如何在不改变其他的情况下将视图模型分配给片段?

解决方案:

首先,将activityViewModels()改为viewModels()

然后,问题出在 setFragmentResultListener 上。在实例化新片段之前调用它,然后在片段 A 上而不是在片段 B 上进行调用。我决定使用 Bundle 对象在目的地之间传递数据。

非常感谢

【问题讨论】:

  • 仅供参考by viewModels() 的要点是同一个类 的每个实例都获得相同的ViewModel 对象,因此不同实例之间共享相同的数据。 by activityViewModels() 允许片段向当前活动询问特定 VM 的副本 - 它允许同一活动中的单独片段访问同一 VM 并共享数据/状态。 (导航库中有一个类似的库,by navGraphViewModels(),它在整个导航图中的所有内容之间共享 VM 实例)。如果您希望 Fragment 拥有自己的唯一数据,请使用 by viewModels()

标签: android kotlin fragment viewmodel


【解决方案1】:

通过这种方式初始化视图模型,视图模型取决于你必须使用这种方式的父活动

private val detailViewModel: DetailViewModel by viewModels()

您的视图模型实例取决于您的片段实例。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
  • 非常感谢您的帮助。我更新了我的问题
【解决方案2】:

听起来您想将视图模型链接到片段。

ViewModelProvider(this,viewModelFactory).get(MyViewModel.class)

【讨论】:

  • 这样的? detailViewModel = ViewModelProvider(this)[DetailViewModel::class.java]
  • 是的,就可以了。我正在使用手机,所以稍后我会改进我的答案。
猜你喜欢
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多