【问题标题】:One ViewModel Instance for Multiple Fragment多个片段的一个 ViewModel 实例
【发布时间】:2021-01-04 05:22:29
【问题描述】:

我有 1 个包含父片段的活动。父片段内部是 2 个子片段。我只想创建一个视图模型实例并在两个子片段中使用它。

这是我在父片段中的代码:

val factory = ViewModelFactory.getInstance(requireContext())
viewModel = ViewModelProvider(this, factory)[FavoriteViewModel::class.java]

这个在子片段中:

viewModel = (requireParentFragment() as FavoriteParentFragment).viewModel // force close

它在 logcat 中强制关闭而不会出错。

当我尝试将父片段的代码移动到活动中(不更改代码)并将子片段的代码更改为:

viewModel = (activity as MainActivity).viewModel // works

有效。

那么是否可以做第一种方法(即强制关闭)?如果是这样,如何正确地做到这一点以及为什么我没有收到任何 logcat 错误。

【问题讨论】:

  • 评论这行后可以试试吗?以确保导致崩溃

标签: android android-fragments viewmodel


【解决方案1】:

不要尝试直接从父级访问视图模型,而是使用父级的范围来获取共享视图模型。

在您的子片段中,使用此代码

val factory = ViewModelFactory.getInstance(requireContext())
val viewModel = ViewModelProvider(requireParentFragment(), factory).get(FavoriteViewModel::class.java)

使用上述代码,您不再需要在父片段中存储视图模型的实例。

【讨论】:

  • 所以我不需要在父片段中声明任何内容,只需在两个孩子上使用它,因为给定的范围是 ParentFragment?
  • 正确。如果需要,您可以将工厂保留在父级中并从子级访问它。无需将视图模型存储在父片段中,因为范围会处理它
  • 你得到不同的实例还是代码像以前一样崩溃?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多