如何使用 jetpack 撰写导航注销后将用户重定向到登录页面

Moh*_*mad 6 android android-navigation android-jetpack-compose

我在我的项目中使用 jetpack compose。我的应用程序包含多个屏幕和嵌套导航。所以我的 MainActivity 中有这个:

   val startDestination = if (setting.isUserLoggedIn)
            HomeNavGraph.HomeRoute.route
        else
            AuthenticationNavGraph.AuthenticationRoute.route

        setContent {
            val navController = rememberNavController()
            DoneTheme {
                NavHost(
                    navController = navController,
                    startDestination = startDestination
                ) {
                    authentication(navController = navController)
                    home()
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

此代码根据用户是否已登录来决定将用户导航到身份验证屏幕或主屏幕。首页导航是这样的:

fun NavGraphBuilder.home() {
    navigation(
        startDestination = HomeNavGraph.HomeScreen.route,
        route = HomeNavGraph.HomeRoute.route
    ) {
        composable(route = HomeNavGraph.HomeScreen.route)
        {
            HomeRouteScreen()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

HomeRouteScreen()本身具有底部导航及其 navHost。现在,我想将用户从个人资料屏幕导航到身份HomeRouteScreen()验证屏幕,其可组合项在 MainActivity 导航图中定义。

我的问题是:

如果我调用navcontroller.navigate(AuthenticationNavGraph.AuthenticationScreen.route),我会收到错误消息,表明目的地未明确显示在当前导航图中。另一方面,如果我使用navController主活动中存在的 ,HomeRouteScreen我会收到错误 ViewModelStore should be set before setGraph call。那么我应该如何处理这个问题呢?

小智 0

假设您按下个人资料屏幕内的注销按钮:

onClick = {
    viewModel.logOut().also {
        navHostController.navigate(Screens.SignInScreen.route) {
            popUpTo(Screens.HomeScreen.route) {
                inclusive = true
            }
        }
     }
},
Run Code Online (Sandbox Code Playgroud)

请记住,HomeScreen 是我当前在后台堆栈中的第一个目的地。