在Android/Jetpack Compose中手动预填充导航后台包



是否可以在Android/Jetpack Compose中预先填充导航后台包?

我有一个深度链接,它可以深入导航层次结构,然而,在按下后,它会导航到根路径。

示例:

路线。Main->路线列表->路线详细信息(自变量:id(

深度链接:https://mywebsite.com/details/id

当前行为:它打开Route。然而,在返回时,会打开Route。主

期望行为:它应该打开Route。列出

我知道我可以手动";程序";这种行为,但我更愿意";配置";

我以前也遇到过类似的问题,这似乎是库的预期行为。我的意思是,如果用户从显示Screen_C的深度链接打开应用程序,然后按下返回键,则应该显示应用程序的主屏幕。因此,也许你需要重新验证应用程序的可用性。

但是,如果您想制定一个变通方法,手动处理背压。使用下方的功能

fun navigatingBack(
navController: NavHostController,
destinationRoute: String
) {
val hasBackstackTheDestinationRoute = navController.backQueue.find {
it.destination.route == destinationRoute
} != null
// if the destination is already in the backstack, simply go back
if (hasBackstackTheDestinationRoute) {
navController.popBackStack()
} else {
// otherwise, navigate to a new destination popping the current destination
navController.navigate(destinationRoute) {
navController.currentBackStackEntry?.destination?.route?.let {
popUpTo(it) {
inclusive = true
}
}
}
}
}

假设您声明屏幕ScreenAScreenBScreenC

composable("__A__") {
ScreenA(navController)
}
composable("__B__") {
ScreenB(navController)
}
composable("__C__") {
ScreenC(navController)
}

您可以执行以下操作:

@Composable
fun ScreenA(navController: NavHostController) {
Button(onClick = {
navController.navigate("__B__")
}) {
Text(text = "Screen A - Go to B")
}
}
@Composable
fun ScreenB(navController: NavHostController) {
Button(onClick = {
navController.navigate("__C__")
}) {
Text(text = "Screen B - Go to C")
}
BackHandler {
navigatingBack(navController, "__A__")
}
}
@Composable
fun ScreenC(navController: NavHostController) {
Text(text = "Screen C")
BackHandler {
navigatingBack(navController, "__B__")
}
}

使用上面的示例,如果直接导航到ScreenC并按返回键,则会显示ScreenB。类似的情况发生在ScreenB中,按下后退按钮时会显示ScreenA

最新更新