Jetpack Compose 导航中使用 Hilt

6
我查看了这个信息 https://developer.android.com/jetpack/compose/libraries#hilt-navigation ,了解如何将 ViewModel 注入到组合屏幕中。
目前,我为我的测试应用程序实现了以下内容:
NavHost(
    navController = navController,
    startDestination = startDestination,
    modifier = modifier
) {
    composable(Screen.Topics.name) {
        val parentEntry = remember { navController.getBackStackEntry(Screen.Topics.name) }
        val topicsViewModel = hiltViewModel<TopicsViewModel>(parentEntry)
        TopicsScreen(
            topicsViewModel = topicsViewModel,
            openDrawer = openDrawer,
            navigateToTopicDetails = { topic -> actions.navigateToTopicsDetails(topic) }
        )
    }
    ...

如果我使用会有什么不同吗

val parentEntry = remember { navController.getBackStackEntry(Screen.Topics.name) }
val topicsViewModel = hiltViewModel<TopicsViewModel>(parentEntry)

或者只是

val topicsViewModel = hiltViewModel<TopicsViewModel>()

我猜第一个只有在使用嵌套图表并且想要获取特定图表范围的ViewModel时才需要 https://developer.android.com/jetpack/compose/navigation#nested-nav

那么如果我不使用嵌套图表,这两种方法的作用域是否相同?

所以在我的情况下,我可以只使用hiltViewModel<TopicsViewModel>()吗?

1个回答

0

我认为你已经对你的问题提供了清晰的解释,但总结一下, hiltViewModel<TopicsViewModel>(parentEntry) 用于在嵌套的导航图中使用。当你使用带有 parentEntry 的 hiltViewModel 时,你告诉 Compose 创建一个 ViewModel 实例,该实例作用域限定在嵌套的图中。

由于你的代码中未使用嵌套图,因此可以使用简化版的 hiltViewModel,不用加 parentEntry。这将创建一个 ViewModel 实例,作用域限定在当前屏幕的导航图中,这正是你想要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接