Compose-Navigation:在导航之前从堆栈中删除以前的可组合项

Mah*_*alv 65 android android-jetpack-navigation android-jetpack-compose jetpack-compose-navigation

我正在使用compose-navigation(alpha09) 来处理可组合项之间的导航

我想在移动到下一个目的地时删除启动屏幕(我不希望按下后背返回启动屏幕)

以下尝试未按预期工作:

navHostController.navigate(Route.login.id) {
    navHostController.graph.clear()
}
Run Code Online (Sandbox Code Playgroud)
navHostController.navigate(Route.login.id)
navHostController.graph.clear()
Run Code Online (Sandbox Code Playgroud)
val currentDest = navHostController.currentDestination
navHostController.navigate(Route.login.id)
if (currentDest != null) {
   navHostController.graph.remove(currentDest)
}
Run Code Online (Sandbox Code Playgroud)

那么如何删除启动屏幕然后转到下一步呢?

ikn*_*now 84

在 Jetpack Compose 中1.0.0导航并从返回堆栈中删除以前的 Composable 您可以使用:

navController.navigate(Screens.Login.name) {
    popUpTo(Screens.Splash.name) {
        inclusive = true
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将从Splash屏幕导航到Login并弹出所有内容,包括Splash屏幕。

导航到可组合项 - 文档

  • 凉爽的。感谢。我会接受你的,因为我以前的自我回答现在已经过时了。 (2认同)
  • 太棒了,它有效,popUpTo(0) 对我不起作用 (2认同)

Mah*_*alv 73

对于v1.0.0-alpha09(和 1.0 稳定版)

使用popUpTo(0)您可以在导航到下一个目的地之前清除堆栈。所以:

navHostController.navigate(Route.login.id) {
    // popUpTo = 0 // DEPRECATED
    popUpTo(0)
}
Run Code Online (Sandbox Code Playgroud)

  • @Rulogarcillan 但不是 `popUpTo(0)` (6认同)
  • 我发现的解决方案是避免硬编码 0,您可以使用 navHostController.backQueue 中的第一个元素并将其 id 传递给 popUpTo: popUpTo(navHostController.backQueue.first().destination.id) 有关更多信息,这里是详细信息解释 https://medium.com/@banmarkovic/jetpack-compose-clear-back-stack-popbackstack-inclusive-explained-14ee73a29df5 (3认同)
  • popUpto 已弃用 (2认同)

bbo*_*eck 21

对于不需要知道当前路线的一致可重用函数,请使用此 NavOptionsBuilder 扩展函数

fun NavOptionsBuilder.popUpToTop(navController: NavController) {
    popUpTo(navController.currentBackStackEntry?.destination?.route ?: return) { 
        inclusive =  true
    }
}
Run Code Online (Sandbox Code Playgroud)

^ 与其他答案类似,它 popUpTo 当前路由,但不需要命名特定的当前路由,而是从 backstack 条目中获取它。

现在你可以像这样使用它:

navController.navigate(ScreenRoutes.Login.route) { popUpToTop(navController) }
Run Code Online (Sandbox Code Playgroud)

^ 该示例导航到登录,并且应该清除它之前的整个后台堆栈。


Ban*_*vic 17

除了屏幕之外,返回堆栈还包含导航图,并且其根始终是返回堆栈中的第一个内容。我们的 NavHostController 包含图表,因此通过弹出其 id,您可以清除返回堆栈:

popUpTo(navHostController.graph.id)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,这里是详细说明 https://medium.com/@banmarkovic/jetpack-compose-clear-back-stack-popbackstack-inclusive-explained-14ee73a29df5


Abd*_*een 8

用于清除所有返回堆栈

要从堆栈中删除多个可组合屏幕,请使用以下代码片段

navController.navigate(ScreenRoutes.Login.route){
                    popUpTo(navController.graph.findStartDestination().id){
                        inclusive = true  }}
Run Code Online (Sandbox Code Playgroud)

或者将 Home 保留在后堆栈中

navController.navigate(ScreenRoutes.SelectCourseLayout.route){
    popUpTo(ScreenRoutes.Home.route)
}
Run Code Online (Sandbox Code Playgroud)