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

Joh*_*neh 12 android android-navigation android-jetpack-compose jetpack-compose-navigation

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

我有一个深层链接,可以深入导航层次结构,但是,按后退时,它会导航到根路线。

例子:

Route.Main -> Route.List -> Route.Details(参数:id)

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

当前行为:它使用正确的参数打开 Route.Details,但是,在 onBack 时,它打开 Route.Main

期望的行为:它应该打开 Route.List

我知道我可以手动“编程”此行为,但我更喜欢“配置”它。

ngl*_*ber 1

我以前也遇到过类似的问题,似乎这是图书馆的预期行为。我的意思是,如果用户从显示 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
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

假设您声明了屏幕ScreenAScreenBScreenC

composable("__A__") {
    ScreenA(navController)
}
composable("__B__") {
    ScreenB(navController)
}
composable("__C__") {
    ScreenC(navController)
}
Run Code Online (Sandbox Code Playgroud)

您可以执行以下操作:

@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__")
    }
}
Run Code Online (Sandbox Code Playgroud)

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