Jetpack Compose Navigation传递URL参数找不到导航目的地如何解决?
问题原因
Jetpack Navigation组件默认使用斜杠/作为路由路径的分隔符,你定义的路由规则HistoryDetail/{webpage}默认仅匹配单段无斜杠的参数值。传入不带斜杠的test时可以正常匹配,传入带多段斜杠的URL(如http://alphaone.me/)时,导航组件会将URL里的斜杠识别为路径分隔符,拆分出多段路径,无法和现有的单参数路由规则匹配,因此抛出找不到目的地的异常。
解决方案
方案1:URL编解码传参
跳转前对URL参数进行编码,转义斜杠、冒号等特殊字符,页面接收参数后再解码还原即可。
跳转示例:val encodedWebUrl = URLEncoder.encode("http://alphaone.me/", StandardCharsets.UTF_8.name()) navController.navigate("HistoryDetail/$encodedWebUrl")参数接收示例:
val encodedWebUrl = entry.arguments?.getString("webpage") ?: "" val originWebUrl = URLDecoder.decode(encodedWebUrl, StandardCharsets.UTF_8.name())方案2:使用通配符匹配全路径(需Navigation 2.4.0+版本支持)
修改路由定义,在参数占位符后添加*通配符,即可匹配参数中包含的所有斜杠内容:composable( route = "HistoryDetail/{webpage*}", arguments = listOf( navArgument("webpage") { type = NavType.StringType } ), ) { entry -> val text = entry.arguments?.getString("webpage") ?: "" }修改后直接传入原始URL即可正常跳转,无需编解码处理。
方案3:使用Bundle传递参数
不将参数嵌入路由路径,改为通过Bundle传递,彻底规避路径特殊字符问题:
路由定义:composable( route = "HistoryDetail", arguments = listOf( navArgument("webpage") { type = NavType.StringType nullable = false } ) ) { entry -> val text = entry.arguments?.getString("webpage") ?: "" }跳转示例:
navController.navigate( "HistoryDetail", bundleOf("webpage" to "http://alphaone.me/") )
内容的提问来源于stack exchange,提问作者Ravi Kumar
相关产品推荐
相关产品推荐

