You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中navController.popBackStack()带参数回退失效问题

问题描述

假设存在A、B、C三个页面,导航关系为A→B→C。从A跳转B时无需传参,但从C回退至B时可能需要传递参数。当前在C页面调用navController.popBackStack()回退到B时无响应,日志提示目标不在回退栈中。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:40:29