我能用Safeargs传递可为空的数据类型吗?如果不能,我该怎么做?

4

假设我有两个片段。登录和主页。我将主页片段设置为全局目标,其中包含userData作为参数。

enter image description here

如果用户还未登录,则会从登录片段开始。登录并从服务器获取用户数据后,代码将导航到主页并传递 userData。
 val home = AuthenticationFragmentDirections.actionGlobalHomeFragment(userData)
 Navigation.findNavController(view).navigate(home, navOptions)

但问题在于当用户已经登录并打开应用程序时。在这种情况下,他们将直接打开主页片段。而我的应用程序会崩溃出错。因此,我假设可以在参数中设置可为空的数据类型,如 User? ,这样如果 Home 片段不是来自登录,则不需要 userData。从 这里 读取后,我将参数设置为这样以实现 User?
<argument
    android:name="userData"
    android:defaultValue="@null"
    app:argType="User"
    app:nullable="true" />

但问题是,当我把用户数据从登录片段发送到主页时,它说我有太多参数。我在gradle中使用了这个。
implementation "androidx.navigation:navigation-fragment-ktx:2.3.0-alpha04"
    implementation "androidx.navigation:navigation-ui-ktx:2.3.0-alpha04"

1
你为什么不使用 apply plugin: "androidx.navigation.safeargs.kotlin" 来生成Kotlin中的Safe Args呢? - ianhanniballake
是的,根据文档,这意味着您正在生成Java代码,- 您必须使用.kotlin来生成Kotlin代码。 - ianhanniballake
@ianhanniballake 这个和 apply plugin: 'androidx.navigation.safeargs' 不一样吗?我在我的 gradle 应用程序中使用了这个。 - sarah
1
@ianhanniballake 是的,那就是问题所在。谢谢。 - sarah
1个回答

26

当使用apply plugin: "androidx.navigation.safeargs"时,只有必需的参数会被传递到actionGlobalHomeFragment()方法中 - 具有默认值(即非必需的)的参数将通过生成的set方法传递:

val home = AuthenticationFragmentDirections.actionGlobalHomeFragment()
    .setUserData(userData)
Navigation.findNavController(view).navigate(home, navOptions)
如果您切换到应用apply plugin: "androidx.navigation.safeargs.kotlin"(请注意.kotlin),然后生成Kotlin Safe Args代码,则代码使用Kotlin默认参数(即在方法声明中带有userData:UserData = null),这使您可以使用最初尝试的语法。
val home = AuthenticationFragmentDirections.actionGlobalHomeFragment(userData)
Navigation.findNavController(view).navigate(home, navOptions)

我应该在哪里添加 .setUserData(userData) 方法? - Milad Faridnia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接