我以前也遇到过类似的问题,似乎这是图书馆的预期行为。我的意思是,如果用户从显示 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
}
}
}
}
}
假设您声明了屏幕ScreenA
, ScreenB
and ScreenC
.
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
按下后退按钮时会显示。