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)
当您在设置中时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)
| 归档时间: |
|
| 查看次数: |
3571 次 |
| 最近记录: |