如何从 AndroidEntryPoint 的 ViewPager 片段中获取父片段?
How to get parent Fragment from ViewPager Fragment that is an AndroidEntryPoint?
我在 ViewPager 中有一个片段是这样创建的:
companion object {
fun newInstance(someData: SomeData): ViewPagerFragment {
val f = ViewPagerFragment()
val args = Bundle()
args.putParcelable("someData", someData)
f.arguments = args
return f
}
}
它也是一个 Hilt 入口点,它创建自己的 ViewModel,但还需要父 Fragments ViewModel,所以 class 的顶部如下所示:
@AndroidEntryPoint
class ViewPagerFragment : Fragment() {
private val parentViewModel: ParentViewModel by viewModels(
ownerProducer = { requireParentFragment() }
)
private val viewPagerViewModel: ViewPagerViewModel by viewModels()
但是,找不到父片段:
java.lang.IllegalStateException: Fragment ViewPagerFragment{b6d6157}
(e5f3fc7d-2ae4-4275-9763-22826a9be939) id=0x7f09017e} is not a child Fragment, it is
directly attached to
dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper@1852444
我认为这是因为添加 viewPagerViewModel 后生成的 ViewPagerFragment class 不是 childFragment。是否有解决方法来获取父 Fragment 并最终获取父 ViewModel?后者是主要目标。
现在我使用 ViewPager,而不是 ViewPager2,因为它是一个遗留的无限包装器 ViewPager。
编辑:
ViewPagerAdapter 是这样创建的:
val pagerAdapter = VpPagerAdapter(
requireActivity().supportFragmentManager,
someData,
)
当您创建 ViewPager 适配器时,如果您希望 ViewPager 中的片段被视为子片段,则需要传入 childFragmentManager
。
我在 ViewPager 中有一个片段是这样创建的:
companion object {
fun newInstance(someData: SomeData): ViewPagerFragment {
val f = ViewPagerFragment()
val args = Bundle()
args.putParcelable("someData", someData)
f.arguments = args
return f
}
}
它也是一个 Hilt 入口点,它创建自己的 ViewModel,但还需要父 Fragments ViewModel,所以 class 的顶部如下所示:
@AndroidEntryPoint
class ViewPagerFragment : Fragment() {
private val parentViewModel: ParentViewModel by viewModels(
ownerProducer = { requireParentFragment() }
)
private val viewPagerViewModel: ViewPagerViewModel by viewModels()
但是,找不到父片段:
java.lang.IllegalStateException: Fragment ViewPagerFragment{b6d6157}
(e5f3fc7d-2ae4-4275-9763-22826a9be939) id=0x7f09017e} is not a child Fragment, it is
directly attached to
dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper@1852444
我认为这是因为添加 viewPagerViewModel 后生成的 ViewPagerFragment class 不是 childFragment。是否有解决方法来获取父 Fragment 并最终获取父 ViewModel?后者是主要目标。
现在我使用 ViewPager,而不是 ViewPager2,因为它是一个遗留的无限包装器 ViewPager。
编辑:
ViewPagerAdapter 是这样创建的:
val pagerAdapter = VpPagerAdapter(
requireActivity().supportFragmentManager,
someData,
)
当您创建 ViewPager 适配器时,如果您希望 ViewPager 中的片段被视为子片段,则需要传入 childFragmentManager
。