【问题标题】:How do I preserve ViewModel in nested Fragments inside ViewPager2如何在 ViewPager2 内的嵌套片段中保留 ViewModel
【发布时间】:2021-09-21 12:23:30
【问题描述】:

我有一个带有RootFragment 的应用程序,其中包含一个ViewPager2,呈现多个ChildFragment

RootFragment 有一个RootViewModel,每个ChildFragment 也有一个ChildViewModel

运行应用程序,我可以看到根片段的视图模型被创建一次,并通过旋转等保存 - 这正是我所期望的。

但是,当我滚动浏览子片段并再次返回时,每次 ViewPager2 销毁/重新创建要显示的片段时,似乎都会重新创建 ChildVieWModels。这根本不是我需要的!

即使子片段本身被ViewPager2 销毁和重新创建,我如何才能保留子片段的视图模型?

我的子片段正在请求这样的视图模型:

private val viewModel: ChildViewModel by viewModels()

我也尝试将子视图模型的范围限定为父片段,但这只是意味着每个子片段都会获得相同的 ChildViewModel 实例,这也不完全正确:

private val viewModel: ChildViewModel by viewModels({ requireParentFragment() })

我查看了 ViewPager2 的示例,但它们的子片段中似乎都没有视图模型。

我在这里误解了什么?

【问题讨论】:

    标签: android android-fragments android-viewmodel android-viewpager2


    【解决方案1】:

    即使子 Fragment 本身已被 ViewPager2 销毁和重新创建,我如何才能保留子 Fragment 的视图模型?

    您可以设置屏幕外页面限制。见文档https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2#setOffscreenPageLimit(int)

    如果您将限制设置为 2,那么将保持活动状态的片段是视图页面中的当前选项卡、接下来的 2 个选项卡和前 2 个选项卡。如果选项卡/子片段的数量是静态的且很小(例如 5 个或更少),您可以使用它来保持 viewpager 中的所有片段和视图模型处于活动状态。

    如果子片段之间有一些共享状态或子片段中有一些昂贵的查询,那么您可以将其放在 RootViewModel 中,并按照您所指出的那样通过 requireParentFragment 在您的子片段中使用它。

    真的没有比设置屏幕外限制或与父片段共享视图模型更好的方法了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多