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

Jetpack Compose含特殊字符参数导航失败,求解决方案

解决DeepLink中标题含/导致导航失败的问题

问题原因

你的页面标题Can I change this (Pin / Password)?包含/,在构建DeepLink URI时,这个/会被系统解析为路径分隔符,导致实际请求的路径被拆分成多个段,和导航图中定义的路径不匹配,因此抛出找不到目标的异常。

解决方案

  • URL编码标题参数
    在构建DeepLink请求前,对标题进行URL编码,将/转换为%2F,避免被解析为路径分隔符:

    // 编码标题
    String encodedTitle = URLEncoder.encode("Can I change this (Pin / Password)?", "UTF-8");
    // 构建URI
    Uri deepLinkUri = Uri.parse("android-app://androidx.navigation/testScreen/" + encodedTitle + "/100/300");
    NavDeepLinkRequest request = NavDeepLinkRequest.Builder.fromUri(deepLinkUri).build();
    

    在目标页面接收参数时,再解码还原标题:

    String title = URLDecoder.decode(getArguments().getString("title"), "UTF-8");
    
  • 改用查询参数传递标题
    把标题放在查询参数中,而非路径里,彻底避免路径分隔符冲突:

    Uri deepLinkUri = Uri.parse("android-app://androidx.navigation/testScreen/100/300")
        .buildUpon()
        .appendQueryParameter("title", "Can I change this (Pin / Password)?")
        .build();
    NavDeepLinkRequest request = NavDeepLinkRequest.Builder.fromUri(deepLinkUri).build();
    

    目标页面获取标题:

    String title = getArguments().getString("title");
    
  • 修改导航图的DeepLink参数规则
    如果是在导航XML中定义的DeepLink,可通过正则表达式允许标题参数包含/:

    <fragment
        android:id="@+id/testScreen"
        android:name="com.example.TestScreenFragment">
        <argument
            android:name="title"
            app:argType="string"
            app:regex=".*" /> <!-- 允许匹配任意字符,包括/ -->
        <deepLink
            app:uri="android-app://androidx.navigation/testScreen/{title}/100/300" />
    </fragment>
    

    这种方式需注意正则的匹配范围,确保不会误匹配后续路径段。

内容的提问来源于stack exchange,提问作者Ali_Waris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:20:57