具有不同导航图的相同片段(由 hiltNavGraphViewModels 提供)

aba*_*lta 7 navigation android android-fragments android-jetpack-navigation dagger-hilt

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

主导航图

nav_homenav_video具有相同的片段,因此我希望 HomeViewModel 和 VideoViewModel 将其状态保留在这些图中。正如你在下面看到的。

nav_home.xml

导航主页图

nav_video.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)
Run Code Online (Sandbox Code Playgroud)

如果我从家里到达这个片段,categoryViewModel 会抛出异常,并显示:

java.lang.IllegalArgumentException: NavController 的返回堆栈上没有 ID 为 2131362218 的目标。当前目的地是 Destination(com.example.app:id/courseDetailFragment) label=CourseDetailFragment class=com.example.app.ui.course.CourseDetailFragment

日志异常

另一方面,如果我从视频中到达这个片段,homeViewModel 会抛出相同的异常。

任何帮助将受到热烈欢迎。谢谢。

rdl*_*dlc 3

也许你可以用这个:

private val sampleViewModel: SampleViewModel by hiltNavGraphViewModels(findNavController().graph.id)
Run Code Online (Sandbox Code Playgroud)

然而,就我而言,虚拟机甚至在之前就已延迟初始化onCreate(),并且findNavController()当时尚不可用。

这就是我所做的:

fun provideVM(): SampleVM =
hiltNavGraphViewModels<SampleVM>(findNavController().graph.id).value
Run Code Online (Sandbox Code Playgroud)

provideVM()期间被调用onViewCreated()