Search code examples
androidandroid-fragmentsandroid-viewpagerandroid-viewmodeldagger-hilt

How to get parent Fragment from ViewPager Fragment that is an AndroidEntryPoint?


I have a Fragment within a ViewPager that is created like this:

companion object {

    fun newInstance(someData: SomeData): ViewPagerFragment {
        val f = ViewPagerFragment()
        val args = Bundle()
        args.putParcelable("someData", someData)
        f.arguments = args
        return f
    }
}

It is also a Hilt entry point, and it creates its own ViewModel, but also needs the parent Fragments ViewModel, so the top of the class looks like this:

@AndroidEntryPoint
class ViewPagerFragment : Fragment() {

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

However, the parent Fragment is not found:

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

I think this is happening because after adding the viewPagerViewModel the generated ViewPagerFragment class is not a childFragment. Is there a workaround to get the parent Fragment and ultimately get the parent ViewModel? The latter is the main goal.

For now I use ViewPager, not ViewPager2, because it's a legacy infinite wrapper ViewPager.

EDIT:

The ViewPagerAdapter is created like this:

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

Solution

  • When you create your ViewPager adapter, you need to pass in the childFragmentManager if you want the fragments in the ViewPager to be considered child fragments.