【问题标题】:How to get parent Fragment from ViewPager Fragment that is an AndroidEntryPoint?如何从作为 AndroidEntryPoint 的 ViewPager 片段中获取父片段?
【发布时间】:2021-01-24 20:40:31
【问题描述】:

我在 ViewPager 中有一个 Fragment,它是这样创建的:

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,所以类的顶部是这样的:

@AndroidEntryPoint
class ViewPagerFragment : Fragment() {

    private val parentViewModel: ParentViewModel by viewModels(
        ownerProducer = { requireParentFragment() }
    )
    private val viewPagerViewModel: ViewPagerViewModel by viewModels()

但是没有找到父Fragment:

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 类不是 childFragment。是否有一种解决方法来获取父 Fragment 并最终获取父 ViewModel?后者是主要目标。

现在我使用 ViewPager,而不是 ViewPager2,因为它是一个传统的无限包装 ViewPager。

编辑:

ViewPagerAdapter 是这样创建的:

val pagerAdapter = VpPagerAdapter(
                requireActivity().supportFragmentManager,
                someData,
        )

【问题讨论】:

  • 该异常与 Hilt / ViewModels 无关,但您在构建 ViewPager 适配器时实际上并没有使用childFragmentManager。您能否包含该代码和构建适配器的代码?
  • @ianhanniballake 宾果游戏!它是使用 Activity 创建的。我添加了sn-p。我稍后会尝试看看它是否有效。我想应该是的。
  • @ianhanniballake 我切换到 ChildFragmentManager 并且它有效。随时发布答案,我会接受。

标签: android android-fragments android-viewpager android-viewmodel dagger-hilt


【解决方案1】:

创建 ViewPager 适配器时,如果您希望 ViewPager 中的片段被视为子片段,则需要传入 childFragmentManager

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多