【发布时间】: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