android 合成-导航:导航前从堆栈中移除上一个可组合对象

wf82jlnq  于 2023-01-03  发布在  Android
关注(0)|答案(8)|浏览(202)

我使用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)
}

那么,我如何删除启动画面,然后移动到下一个?

pokxtpni

pokxtpni1#

在Jetpack Compose 1.0.0-rc01中导航并从回栈中删除以前的Composable您可以用途:

navController.navigate(Screens.Login.name) {
    popUpTo(Screens.Splash.name) {
        inclusive = true
    }
}

上述代码将从Splash屏幕导航到Login,并弹出所有内容,包括Splash屏幕。
导航到可组合文档- docs

rdlzhqv9

rdlzhqv92#

适用于v1.0.0-α 09(和1.0稳定版本)
使用popUpTo(0)可以在导航到下一个目标之前清除堆栈。

navHostController.navigate(Route.login.id) {
    // popUpTo = 0 // DEPRECATED
    popUpTo(0)
}
pvabu6sv

pvabu6sv3#

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

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

^类似于其他答案,popUpTo当前路径,但不需要命名特定的当前路径,而是从backstack条目中获取。
现在您可以这样使用它:

navController.navigate(ScreenRoutes.Login.route) { popUpToTop(navController) }

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

0h4hbjxa

0h4hbjxa4#

用于清除所有返回堆栈

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

navController.navigate(ScreenRoutes.Login.route){
                    popUpTo(navController.graph.findStartDestination().id){
                        inclusive = true  }}

或将Home保留在后栈

navController.navigate(ScreenRoutes.SelectCourseLayout.route){
    popUpTo(ScreenRoutes.Home.route)
}
z31licg0

z31licg05#

喷气背包组合v1.0.5

navController.backQueue.removeIf { it.destination.route == "Splash" }
navController.popBackStack()
dl5txlt9

dl5txlt96#

要清除反向堆栈,只需创建这个Extension函数,并在任何适用的地方重用它。

fun NavHostController.navigateAndClean(route: String) {
    navigate(route = route) {
        popUpTo(graph.startDestinationId) { inclusive = true }
    }
    graph.setStartDestination(route)
}
ukqbszuj

ukqbszuj7#

经过这么多次尝试,我已经找到了更好的方法来清除回栈在注销的情况下.大多数生产应用程序将清除启动或登录屏幕,只要我们导航到主屏幕,将有多种方式降落到主屏幕以及.
所以,我们可能不知道执行popupTo的初始屏幕。如果有底部栏,那么故事也会太难。
这里有一个魔术可以工作的所有场景

val firstBackStackRoute = navController.backQueue.firstOrNull()?.destination?.route
 firstBackStackRoute?.let { 
        navController.popBackStack(firstBackStackRoute, true)
  }
gfttwv5a

gfttwv5a8#

我发现的解决方案是避免硬编码0,您可以使用navHostController.backQueue中的第一个元素,并将其id传递给popUpTo:

popUpTo(navHostController.backQueue.first().destination.id)

有关详细信息,请参阅https://medium.com/@banmarkovic/jetpack-compose-clear-back-stack-popbackstack-inclusive-explained-14ee73a29df5的详细说明

相关问题