Jetpack Compose:获取带参数的导航实际路由
直接调用navController.currentBackStackEntry?.destination?.route得到的是导航图中定义的模板路径(如chat/{id}),因为这个属性存储的是路由的占位符模板,而非实际跳转时填充参数后的路径。以下是两种解决方法:
方法一:手动替换占位符参数
通过当前回退栈条目(NavBackStackEntry)的arguments获取实际参数值,再替换模板中的占位符:
val currentEntry = navController.currentBackStackEntry ?: return val templateRoute = currentEntry.destination.route ?: return val args = currentEntry.arguments ?: return val actualRoute = templateRoute.replace(Regex("\\{(.+?)\\}")) { matchResult -> val paramKey = matchResult.groupValues[1] args.get(paramKey)?.toString() ?: "" } // actualRoute即为带实际参数的路径,例如chat/127436112
方法二:利用NavBackStackEntry的uri属性(Navigation 2.4.0+)
从Navigation 2.4.0版本开始,NavBackStackEntry新增了uri属性,该属性直接包含带实际参数的完整路径,只需提取路径部分即可:
val currentEntry = navController.currentBackStackEntry ?: return val actualPath = currentEntry.uri.path?.removePrefix("/") ?: "" // actualPath结果为chat/127436112(去掉了开头的斜杠,可根据需求调整)
注意:如果参数可能为空,需根据业务场景添加空值处理逻辑,避免出现异常或不符合预期的路径。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

