浏览 Jetpack Compose 时如何清除后台堆栈?

R0c*_*0ck 4 android-jetpack-navigation android-jetpack-compose

我正在应用程序中实现注销操作。我希望当用户单击“注销”时,转到“登录”。当用户采取以下路径:登录 -> 主页 -> 设置(单击注销) -> 登录时,当我按回键时,应用程序将转到后台并关闭,这是我想要的行为。

但是,当用户采用以下路线时:登录 -> 主页 -> ScreenOne -> ScreenTwo -> 主页 -> ScreenOne -> 设置(单击“注销”)-> 登录,当您按返回时,它会返回到“设置”并如果您再次按下它,它将转到 ScreenOne 等。

这就是当我单击“注销”时导航到“登录”的方式:

navController.navigate(NavigationItem.Login.route) {
            popUpTo(NavigationItem.Login.route) {
                inclusive = true
            }
        }
Run Code Online (Sandbox Code Playgroud)

注意:已经尝试将 Navigation.Home.route 作为 popUpTo 的参数。

我不知道是否相关,但这就是我在 Home -> ScreenOne -> ScreenTwo -> Home -> ScreenOne 之间进行导航的方式:

navController.navigate(item.route) {
                    navController.graph.startDestinationRoute?.let { route ->
                        popUpTo(route = route) {
                            saveState = true
                        }
                    }

                    launchSingleTop = true
                    restoreState = true
                }
Run Code Online (Sandbox Code Playgroud)

有谁知道我如何清除后堆栈或保证在第二种行为中,当我在注销后进入登录屏幕并按“返回”时,应用程序将进入第二个计划?

编辑:添加了 NavHost 结构。

@Composable
@ExperimentalFoundationApi
@ExperimentalComposeUiApi
@ExperimentalMaterialApi
fun Navigation(navController: NavHostController, updateBottomBarVisibility: (Boolean) -> Unit) {
    NavHost(
        navController = navController,
        startDestination = NavigationItem.Login.route
    ) {
        composable(route = NavigationItem.Login.route) {
            LoginScreen(navController)
        }

        composable(route = NavigationItem.Events.route) {
            EventsScreen(updateBottomBarVisibility, navController)
        }

        composable(route = NavigationItem.Home.route) {
            HomeScreen(updateBottomBarVisibility, navController)
        }

        composable(route = NavigationItem.Prizes.route) {
            PrizesScreen(updateBottomBarVisibility, navController)
        }

        composable(route = NavigationItem.Account.route) {
            AccountScreen(navController)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

zjm*_*jmo 8

当您在设置中时logout

navController.popBackStack(NavigationItem.Login.route, inclusive = false, saveState = false)
Run Code Online (Sandbox Code Playgroud)

没有必要保存状态,因为一旦使用结束,就必须使用新的更新数据再次登录。

此时,如果用户单击返回,应用程序应该进入前台。

如果这不起作用,则登录屏幕可能不在后台堆栈上。我会尝试添加一条到 NavHost 的路由,并在排除和保存状态关闭的情况下 popBack 到它。

否则,您可能会多次调用导航方法,感谢预期

fun Navigation(navController: NavHostController, updateBottomBarVisibility: (Boolean) -> Unit) {
    NavHost(
        route = "nav_host_route"
        navController = navController,
        startDestination = NavigationItem.Login.route
    ) {}

//navigate to top destinations like HOME
navController.navigate(item.route) {
                    popUpTo(route = "nav_host_route") {
                        inclusive = false
                        saveState = true
                    }
                  
                    launchSingleTop = true
                    restoreState = true
                }
Run Code Online (Sandbox Code Playgroud)

登出:

navController.navigate(LogIn){ 
    popUpTo("nav_host_route"){
        saveState = false
        inclusive = false
    }
    restoreState = false
    launchSingleTop = true
}
Run Code Online (Sandbox Code Playgroud)