Jetpack Compose中navController.popBackStack()带参数回退失效问题
问题描述
假设存在A、B、C三个页面,导航关系为A→B→C。从A跳转B时无需传参,但从C回退至B时可能需要传递参数。当前在C页面调用navController.popBackStack()回退到B时无响应,日志提示目标不在回退栈中。
NavHost配置代码
val navigationController = rememberNavController() NavHost( navController = navigationController, startDestination = Screen.Intro.name ) { composable( route = "B?countryCode={countryCode}", arguments = listOf(navArgument("countryCode") { nullable = true type = NavType.StringType defaultValue = null }) ) { navBackStack -> val countryCode: String? = navBackStack.arguments?.getString("countryCode") B(navigationController, countryCode) } }
回退实现代码
val backStackRoute = if (chosenCountry == null) "B" else "B?countryCode=${chosenCountry.code}" navigationController.popBackStack( route = backStackRoute, inclusive = false )
异常日志
I/NavController: Ignoring popBackStack to destination -1599746084 as it was not found on the current back stack
问题原因
核心问题是回退栈中B页面的实际路由与调用popBackStack时传入的路由不匹配:
- 从A跳转B时,入栈的B页面路由是
B?countryCode=null(因配置中countryCode默认值为null),而非你传入的B。NavController严格匹配路由字符串,所以用B找不到栈中的目标。 - 当
chosenCountry不为null时,你拼接的B?countryCode=${chosenCountry.code}也不是栈中B页面的原始路由。NavController匹配路由时,只会识别定义时的带占位符的路由(即B?countryCode={countryCode}),而非带实际参数值的路由字符串,因此同样无法匹配。
内容的提问来源于stack exchange,提问作者MohammadBaqer
相关产品推荐
相关产品推荐

