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

如何借助SafeArgs创建Navigation组件的显式DeepLink?

解决Navigation组件SafeArgs在NavDeepLinkBuilder中避免硬编码参数名的问题

核心原因

Navigation组件的SafeArgs生成的参数类(如NavigationChatPrivateArgs)是不可变数据类,其主构造方法被标记为internal,无法直接在外部实例化,因此你不能直接用NavigationChatPrivateArgs(roomId, receiver)的方式创建对象。

优雅解决方案:使用自动生成的Builder类

SafeArgs会为每个参数类自动生成对应的Builder内部类,通过Builder可以安全构建参数实例,再转换为Bundle传入NavDeepLinkBuilder。

示例代码

// 使用Builder构建参数实例
val chatArgs = NavigationChatPrivateArgs.Builder(roomId, receiver).build()

return NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph_home)
    .addDestination(R.id.navigation_chat_private)
    .setArguments(chatArgs.toBundle())
    .createPendingIntent()

补充:处理可选参数

如果你的导航参数中有设置defaultValue的可选参数,Builder会提供对应的setXXX()方法来设置这些参数,示例如下:
假设nav_graph中新增可选参数:

<argument android:name="isMuted" app:argType="boolean" android:defaultValue="false" />

则Builder的使用方式为:

val chatArgs = NavigationChatPrivateArgs.Builder(roomId, receiver)
    .setIsMuted(true) // 设置可选参数
    .build()

额外优化:直接使用参数名常量(可选)

如果你觉得Builder写法繁琐,也可以利用SafeArgs生成的参数名常量,避免硬编码字符串:

val args = bundleOf(
    NavigationChatPrivateArgs.roomId to roomId,
    NavigationChatPrivateArgs.receiver to receiver
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:43:26