撰写导航:在后台堆栈中传递参数

Dr.*_*dRO 10 android android-jetpack-compose jetpack-compose-navigation

我已经尝试了所有可能的方法,看起来没有找到解决方案。

我正在使用带有撰写屏幕的全撰写应用程序,并使用撰写导航在此屏幕之间导航,我有一个场景,我以这种方式进一步导航

屏幕 A > 屏幕 B1 >..> 屏幕 BN > 屏幕 C

现在,在完成屏幕 C 上的功能后,我想弹回屏幕 A,但这次带有一个可选参数,例如:成功

我这样做是为了导航到 A:

val route = "ScreenA?arg={arg}"

// navigating like this
navController.navigate("ScreenA")


// handling
composable(route, arguments = listOf(navArgument("arg") { nullable = true })){
  ScreenA()
}
Run Code Online (Sandbox Code Playgroud)

现在,为了从我所在的位置弹回到 ScreenA,我已经这样做了:

navController.popBackStack(
                route = route,
                inclusive = false
            )
Run Code Online (Sandbox Code Playgroud)

我现在想在返回时发送参数。我尝试将路线添加为

 ScreenA?arg=success
Run Code Online (Sandbox Code Playgroud)

这在 popBackStack 函数中不起作用,它检查路由的哈希码

popBackStack(createRoute(route).hashCode(), inclusive, saveState)
Run Code Online (Sandbox Code Playgroud)

在这种情况下我的导航失败

我也尝试过将参数设置为后退堆栈条目,但由于它可能是中间的 N Screen,因此无法工作。需要了解我哪里做错了或者是否有办法做到这一点?

Bij*_*han 6

尝试将值设置为 previousBackStackEntry 像

navController.previousBackStackEntry?.savedStateHandle?.set(
                        "resultStatus",
                        true
                    )
Run Code Online (Sandbox Code Playgroud)

从第二个屏幕和第一个屏幕(即 ScreenA)中添加

val noResultData =
                backStackEntry.savedStateHandle.getLiveData<Boolean>("resultStatus")
                    .observeAsState(false)
Run Code Online (Sandbox Code Playgroud)

在 composable(route){ backStackEntry -> } 内。这可能会解决您的问题。

使用后,您可以像这样删除它

backStackEntry.savedStateHandle.remove<Boolean>("resultStatus")
Run Code Online (Sandbox Code Playgroud)