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 屏幕。

Navigate to a composable - docs

用于清除所有返回堆栈

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

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) }

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