使用安全参数创建深层链接

问题描述 投票:0回答:1

我正在为我的应用程序(导航组件)中的片段创建一个显式深层链接。这就是我目前的做法:

val args = bundleOf(
    "roomId" to roomId,
    "receiver" to receiver
)
return NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph_home)
    .addDestination(R.id.navigation_chat_private)
    .setArguments(args)
    .createPendingIntent()

参数在 nav_graph 中定义如下:

<argument android:name="roomId" app:argType="string" />
<argument android:name="receiver" app:argType="integer" />

这没有问题。但我不禁想知道是否有办法避免两次硬编码参数名称。我觉得必须有更好的方法。类似的东西:

val chatArgs = NavigationChatPrivateArgs(roomId,receiver)
return NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph_home)
    .addDestination(R.id.navigation_chat_private)
    .setArguments(chatArgs.toBundle())
    .createPendingIntent()

但是生成的safeArgs类中并没有这个构造函数。我也试过调用空构造函数然后设置值,但是参数是

val
s,所以不能重新分配。有人知道这样做的优雅方法吗?

android kotlin android-architecture-navigation android-safe-args
1个回答
0
投票

当您使用 Safe Args 插件通过

androidx.navigation.safeargs.kotlin
插件生成 Kotlin 代码时,每个 Args 类都会获得一个构造函数,该构造函数使用 arguments 作为必需的参数,使用 default arguments 作为具有
defaultValue
nullable 的参数
.

这使您可以生成与您发布的代码完全相同的代码:

val chatArgs = NavigationChatPrivateArgs(roomId,receiver)
val bundle = chatArgs.toBundle()

但是,当您通过

androidx.navigation.safeargs
插件生成Java代码时,默认参数不可用。因此,Java 代码使用 builder 模式——您构造一个
NavigationChatPrivageArgs.Builder
实例,它将所需参数作为
Builder
类的构造函数参数,并将可选参数作为
Builder
上可用的附加设置器,然后调用
build()
Builder
上构建类。

// Assuming both parameters are required
val chatArgs = NavigationChatPrivateArgs.Builder(roomId,receiver).build()
val bundle = chatArgs.toBundle()

所以在所有情况下,是的,您可以直接创建您的 Args 类,以便在这种情况下或在测试中使用。

© www.soinside.com 2019 - 2024. All rights reserved.