Compose导航参数含大括号?如何获取无大括号的干净字符串
解决导航参数带大括号的问题
核心原因
你遇到的问题大概率是导航传参时错误地把大括号一起拼进了路由字符串,或者参数本身就带大括号。下面分两种情况给出解决办法:
情况1:修复传参方式(推荐)
路由定义里的/{$USER_ID_KEY}是Navigation的占位符语法,实际传参时不需要加大括号。比如你导航到NotesScreen的代码应该是这样:
// 假设actualUserId是你要传递的真实用户ID,比如"NIsKtJ4QqteqSEwuMI7" navController.navigate("${NotesScreen.route}/$actualUserId")
这样在接收端backStackEntry.arguments?.getString(USER_ID_KEY)拿到的就是干净的字符串,不会带大括号。
情况2:紧急处理已传入的带括号参数
如果暂时没法修改传参逻辑,可以在接收参数时直接去掉首尾的大括号:
composable( route = NotesScreen.route + "/{$USER_ID_KEY}" ) { backStackEntry -> val rawUserId = backStackEntry.arguments?.getString(USER_ID_KEY) // 去掉首尾的{和} val cleanUserId = rawUserId?.removeSurrounding("{", "}") NotesScreen( navController = navController, userId = cleanUserId ) }
更规范的方案:使用Safe Args
为了彻底避免这类手动拼接路由的错误,建议用Navigation组件的Safe Args功能:
- 在模块的build.gradle中添加Safe Args插件依赖
- 在导航图(nav_graph.xml)里给NotesScreen的路由定义参数
- 利用生成的安全参数类传递和接收参数,完全不需要手动拼接字符串,从根源避免参数格式错误。
内容的提问来源于stack exchange,提问作者RufusInZen
相关产品推荐
相关产品推荐

