首页 > 解决方案 > 使用父片段作为所有者在 ViewPager 中共享 ViewModel

问题描述

我在 ViewPager 中有一个带有片段 B 和片段 C 的父片段 A。我想在 Fragment B 和 Fragment C 中共享 Fragment 的 A ViewModel。

这是我的方法,起初看起来很直观:

在包含 ViewPager 的父片段 A 中,我像这样创建我的 viewModel:

val viewModel by viewModels<SharedViewModel>()

...

@HiltViewModel
class SharedViewModel @Inject constructor(
    stateHandle: SavedStateHandle
) {

   val myArgument = stateHandle.get<Boolean>("myArgument")
   ...

 }

我的 ViewPager Fragment 的 B 和 C 正在尝试访问相同的SharedViewModel实例,如下所示:

   private val sharedViewModel by viewModels<SharedViewModel>(
        ownerProducer = { requireParentFragment() }
    )

一切正常,除非进程被破坏,我savedStateHandle的 inSharedViewModel不保留导航组件传递的参数。这样做会SharedViewModel返回 null 并且savedStateHandle是空的。

val myArgument = stateHandle.get<Boolean>("myArgument")

有人知道为什么会这样吗?使用activityViewModels似乎可以解决这个问题,但我不完全明白为什么。

标签: androidandroid-viewpagerandroid-architecture-navigationandroid-jetpack-navigationdagger-hilt

解决方案


推荐阅读