如何借助SafeArgs创建Navigation组件的显式DeepLink?
核心原因
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
相关产品推荐
相关产品推荐

