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
相关产品推荐
相关产品推荐

