Android Jetpack Navigation跨模块DeepLink携带Bundle参数跳转如何实现
你当前代码无法获取参数的核心原因有两个:
- 构造
NavDeepLinkRequest时使用的Uri仍保留占位符{myId},未替换为实际参数值,Navigation组件无法从占位符中解析到有效数值 navigate(NavDeepLinkRequest, NavOptions)重载方法默认不支持直接传入额外Bundle,所有声明在导航图中的参数需要从Uri中解析,或手动匹配目的地后传入
方案1:直接拼接参数到Uri(适合基础类型参数)
这是跨模块深链接导航最简单的实现方式,直接将实际参数值替换Uri中的占位符,Navigation会自动将Uri参数解析到目的地的navArgs中,无需额外传Bundle:
修改后的OneFragment.kt
val myId = 123L // 直接将参数值拼入Uri,替换占位符 val request = NavDeepLinkRequest.Builder .fromUri("myapp://my.app?myId=${myId}".toUri()) .build() findNavController().navigate( request, navOptions )
修改完成后TwoFragment中即可通过args.myId直接拿到123L的数值。
方案2:匹配深链接后手动传Bundle(适合含复杂类型参数的场景)
如果需要传递Parcelable/Serializable等无法序列化到Uri中的复杂参数,可以先匹配深链接得到目的地ID,再调用支持传Bundle的navigate重载:
修改后的OneFragment.kt
val myId = 123L val deepLinkUri = "myapp://my.app".toUri() val request = NavDeepLinkRequest.Builder.fromUri(deepLinkUri).build() val navController = findNavController() // 匹配深链接得到对应的目的地信息 val deepLinkMatch = navController.graph.matchDeepLink(request) if (deepLinkMatch != null) { // 可传入任意Bundle参数,包含基础类型、复杂序列化对象等 val bundle = bundleOf( "myId" to myId, "extraParcelableData" to MyParcelableObj() // 可传复杂参数 ) navController.navigate( deepLinkMatch.destination.id, bundle, navOptions ) }
这个方案既避免了跨模块直接引用资源ID,又支持任意类型的参数传递。
注意事项
确保宿主Activity的Manifest中配置了导航图的meta-data属性,保证深链接可以被正确匹配:
<activity android:name=".MainActivity" android:exported="true"> <!-- 其他intent-filter、配置项 --> <meta-data android:name="androidx.navigation.nav_graph" android:value="@navigation/navigation" /> </activity>
参数名称需要和导航图中argument标签声明的android:name完全一致,类型也要和app:argType匹配,避免解析失败。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

