Android Navigation同目的地多相似deepLink匹配异常是什么原因?
问题原因
该问题是对Navigation组件deepLink的匹配优先级和占位符默认匹配规则理解不到位导致的,不属于配置语法错误:
- Navigation组件的deepLink占位符
{param}默认是贪婪匹配模式,可以匹配包含斜杠/在内的任意字符,并非默认只匹配单段路径 - 同一目标页面配置多个deepLink时,匹配逻辑为「命中第一个符合规则的deepLink后直接停止匹配」,你当前将单参数的最短路径deeplink放在最前面,所有更长的路径都会被它优先拦截,完整路径内容都会被赋值给
first参数
解决方案
可以任选以下一种方式修复,也可以同时使用增强兼容性:
方案1:调整deepLink排列顺序
将路径最长的deepLink放在最前面,最短的放在最后面,保证长路径优先匹配对应参数数量的规则:
<!-- 3参数最长路径优先匹配 --> <deepLink android:id="@+id/deeplink_three" app:uri="https://example.com/{first}/{second}/{third}/" /> <!-- 2参数路径次之 --> <deepLink android:id="@+id/deeplink_two" app:uri="https://example.com/{first}/{second}/" /> <!-- 1参数最短路径放最后 --> <deepLink android:id="@+id/deeplink_one" app:uri="https://example.com/{first}/" />
方案2:给占位符添加单段路径限制(更稳妥)
给每个占位符增加正则限制[^/]+,强制限定每个占位符只能匹配不包含斜杠的单段路径,从根源避免贪婪匹配跨段的问题:
<deepLink android:id="@+id/deeplink_one" app:uri="https://example.com/{first:[^/]+}/" /> <deepLink android:id="@+id/deeplink_two" app:uri="https://example.com/{first:[^/]+}/{second:[^/]+}/" /> <deepLink android:id="@+id/deeplink_three" app:uri="https://example.com/{first:[^/]+}/{second:[^/]+}/{third:[^/]+}/" />
修改后即可得到符合预期的匹配结果:
- 访问
https://example.com/item1/:first="item1",second=null,third=null - 访问
https://example.com/item1/item2/:first="item1",second="item2",third=null - 访问
https://example.com/item1/item2/item3/:first="item1",second="item2",third="item3"
内容的提问来源于stack exchange,提问作者imany apk
相关产品推荐
相关产品推荐

