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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:54:02