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

Android Jetpack Navigation跨模块DeepLink携带Bundle参数跳转如何实现

你当前代码无法获取参数的核心原因有两个:

  1. 构造NavDeepLinkRequest时使用的Uri仍保留占位符{myId},未替换为实际参数值,Navigation组件无法从占位符中解析到有效数值
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:39:04