Compose-Navigation:在导航之前从堆栈中移除先前的可组合项
Compose-Navigation: Remove previous composable from stack before navigating
我正在使用 compose-navigation
(alpha09) 来处理可组合项之间的导航
我想在移动到下一个目的地时删除 启动画面(我不想按 后退 返回飞溅)
以下尝试没有按预期工作:
navHostController.navigate(Route.login.id) {
navHostController.graph.clear()
}
navHostController.navigate(Route.login.id)
navHostController.graph.clear()
val currentDest = navHostController.currentDestination
navHostController.navigate(Route.login.id)
if (currentDest != null) {
navHostController.graph.remove(currentDest)
}
那么如何删除启动画面然后转到下一个?
对于 v1.0.0-alpha09(以及 1.0 稳定版)
使用popUpTo(0)
,您可以在导航到下一个目的地之前清除堆栈。所以:
navHostController.navigate(Route.login.id) {
// popUpTo = 0 // DEPRECATED
popUpTo(0)
}
在 Jetpack Compose 1.0.0-rc01
中导航并从后退堆栈中移除先前的可组合项您可以使用:
navController.navigate(Screens.Login.name) {
popUpTo(Screens.Splash.name) {
inclusive = true
}
}
以上代码将从 Splash
屏幕导航到 Login
并将弹出所有内容,包括 Splash
屏幕。
用于清除所有返回堆栈
要从堆栈中删除多个可组合屏幕,请使用以下代码段
navController.navigate(ScreenRoutes.Login.route){
popUpTo(navController.graph.findStartDestination().id){
inclusive = true }}
或者将主页保留在后台堆栈中
navController.navigate(ScreenRoutes.SelectCourseLayout.route){
popUpTo(ScreenRoutes.Home.route)
}
Jetpack Compose v1.0.5
navController.backQueue.removeIf { it.destination.route == "Splash" }
navController.popBackStack()
对于不需要知道当前路线的一致可重用功能,请使用此 NavOptionsBuilder 扩展功能
fun NavOptionsBuilder.popUpToTop(navController: NavController) {
popUpTo(navController.currentBackStackEntry?.destination?.route ?: return) {
inclusive = true
}
}
^ 与其他答案类似,它弹出到当前路由,但不需要命名特定的当前路由,而是从后台堆栈条目中获取。
现在你可以像这样使用它了:
navController.navigate(ScreenRoutes.Login.route) { popUpToTop(navController) }
^ 该示例导航到登录,并且应该清除它之前的整个后台堆栈。
我正在使用 compose-navigation
(alpha09) 来处理可组合项之间的导航
我想在移动到下一个目的地时删除 启动画面(我不想按 后退 返回飞溅)
以下尝试没有按预期工作:
navHostController.navigate(Route.login.id) {
navHostController.graph.clear()
}
navHostController.navigate(Route.login.id)
navHostController.graph.clear()
val currentDest = navHostController.currentDestination
navHostController.navigate(Route.login.id)
if (currentDest != null) {
navHostController.graph.remove(currentDest)
}
那么如何删除启动画面然后转到下一个?
对于 v1.0.0-alpha09(以及 1.0 稳定版)
使用popUpTo(0)
,您可以在导航到下一个目的地之前清除堆栈。所以:
navHostController.navigate(Route.login.id) {
// popUpTo = 0 // DEPRECATED
popUpTo(0)
}
在 Jetpack Compose 1.0.0-rc01
中导航并从后退堆栈中移除先前的可组合项您可以使用:
navController.navigate(Screens.Login.name) {
popUpTo(Screens.Splash.name) {
inclusive = true
}
}
以上代码将从 Splash
屏幕导航到 Login
并将弹出所有内容,包括 Splash
屏幕。
用于清除所有返回堆栈
要从堆栈中删除多个可组合屏幕,请使用以下代码段
navController.navigate(ScreenRoutes.Login.route){
popUpTo(navController.graph.findStartDestination().id){
inclusive = true }}
或者将主页保留在后台堆栈中
navController.navigate(ScreenRoutes.SelectCourseLayout.route){
popUpTo(ScreenRoutes.Home.route)
}
Jetpack Compose v1.0.5
navController.backQueue.removeIf { it.destination.route == "Splash" }
navController.popBackStack()
对于不需要知道当前路线的一致可重用功能,请使用此 NavOptionsBuilder 扩展功能
fun NavOptionsBuilder.popUpToTop(navController: NavController) {
popUpTo(navController.currentBackStackEntry?.destination?.route ?: return) {
inclusive = true
}
}
^ 与其他答案类似,它弹出到当前路由,但不需要命名特定的当前路由,而是从后台堆栈条目中获取。
现在你可以像这样使用它了:
navController.navigate(ScreenRoutes.Login.route) { popUpToTop(navController) }
^ 该示例导航到登录,并且应该清除它之前的整个后台堆栈。