带 Jetpack Compose 导航的 Hilt

use*_*924 7 android android-jetpack-compose dagger-hilt jetpack-compose-navigation

我检查了此信息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) }
        )
    }
    ...
Run Code Online (Sandbox Code Playgroud)

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

val parentEntry = remember { navController.getBackStackEntry(Screen.Topics.name) }
val topicsViewModel = hiltViewModel<TopicsViewModel>(parentEntry)
Run Code Online (Sandbox Code Playgroud)

要不就

val topicsViewModel = hiltViewModel<TopicsViewModel>()
Run Code Online (Sandbox Code Playgroud)

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

因此,在我的情况下,如果我不使用嵌套图,两种方法的范围是相同的?

那么我可以只用hiltViewModel<TopicsViewModel>()在我的情况下吗?

Ahm*_*han 1

我认为您已经为您的问题提供了明确的解释,但总而言之, hiltViewModel<TopicsViewModel>(parentEntry)当您有嵌套导航图时使用。当您将 hiltViewModel 与 ParentEntry 结合使用时,您是在告诉 Compose 创建一个范围仅限于嵌套图的 ViewModel 实例。

由于您没有在代码中使用嵌套图,因此您可以使用hiltViewModel不带parentEntry 的更简单版本。这将创建一个 ViewModel 实例,其范围仅限于当前屏幕的导航图,这正是您想要的。