如何弹出开始目的地(撰写导航)



我正在使用Jetpack Compose的导航组件。

当我导航时,我在清除backstack以仅包含起始目的地时遇到麻烦。

例如,如果我有3个屏幕A, B, C和D,其中A是我的起始目的地。

我的导航栏可能看起来像:

→B→一个→C

假设我希望在从C导航到d时清除后堆栈为A

如下所示:

navController.navigateToD {
popUpTo(navController.navGraph.startDestinationId) {
inclusive = false
}
}

→B→一个→D

我的backstack将看起来像这样,因为它将startDestinationId匹配到A,因此将弹出到它找到的第一个A条目,而不是根。

我已经尝试使用popUpTo(navController.navGraph.id),这弹出整个backstack,不离开堆栈中的开始目的地。

在这种情况下,有人能帮助我尝试弹出到开始目的地吗?

还有谁能帮我解释一下backQueuenavGraph.id是什么?因为我发现navController.backQueue的第一个元素不是我的起始目的地。

似乎destination.id不是每个backstack条目唯一的,而是每个目的地唯一的?

首先,为什么在你的后台堆栈中有2个屏幕A。A是你的起始目的地你从A ->B。你从B导航到A,你的后堆栈变成了A ->B→一个。而不是从b导航到A,你应该调用navController.popBackStack(),你的后堆栈将只是A而不是A ->B→a .

因为你有2个A在你的后堆栈中,当你从C导航到d时,你的后堆栈被清除到第二个A,变成A ->B→一个→D.我认为这是正常的行为。如果你的后栈有一个A,它会像你期望的那样工作。

其次,如果你想清除整个后栈,只要在导航到屏幕时保留startDestination,你可以调用下面的扩展函数。

fun NavHostController.navigateSingleTopToAndRetainState(route: String) = this.navigate(route) {
popUpTo(
this@navigateSingleTopToAndRetainState.graph.findStartDestination().id
) {
saveState = true
}
launchSingleTop = true
restoreState = true
}