android-fragments 通过hiltNavGraphViewModels显示具有不同导航图的相同片段

yuvru6vn  于 2022-11-13  发布在  Android
关注(0)|答案(1)|浏览(201)

我的应用程序遵循了单一活动模式。我的MainActivity有一个带有4个片段的底部导航。

nav_homenav_video具有相同片段,因此我希望HomeViewModel和VideoViewModel在这些图形中保持它们状态如下所示
导航主页.xml

导航视频.xml

在我的片段上,我使用 hiltNavGraphViewModels 扩展来保持视图模型状态。

@AndroidEntryPoint
class CourseDetailFragment : Fragment(R.layout.fragment_course_detail),
    LoadingDelegate by LoadingDelegateImpl(), NavigationDelegate by NavigationDelegateImpl() {

    private val binding by viewBinding(FragmentCourseDetailBinding::bind)
    private val viewModel: CourseDetailViewModel by viewModels()
    private val categoryViewModel: CategoryViewModel by hiltNavGraphViewModels(R.id.nav_video)
    private val homeViewModel: HomeViewModel by hiltNavGraphViewModels(R.id.nav_home)

如果我从家里访问这个片段,categoryViewModel会抛出异常,它会说:
异常错误:NavController的后台堆栈上没有ID为2131362218的目标。当前目标是Destination(com.example.app:id/courseDetailFragment)label=CourseDetailFragment class=com.example.app.ui.course.CourseDetailFragment

另一方面,如果我从视频访问此片段,homeViewModel将引发相同的异常。
任何帮助都是最受欢迎的。谢谢。

xytpbqjk

xytpbqjk1#

也许你可以用这个:

private val sampleViewModel: SampleViewModel by hiltNavGraphViewModels(findNavController().graph.id)

然而,在我的例子中,vm是延迟初始化的,甚至在onCreate()之前,并且findNavController()在那个时候还不可用。
我是这样做的:

fun provideVM(): SampleVM =
hiltNavGraphViewModels<SampleVM>(findNavController().graph.id).value

onViewCreated()期间调用provideVM()

相关问题