【问题标题】:can I send nullable data type as argument using safeargs ? if not what should I do?我可以使用 safeargs 发送可空数据类型作为参数吗?如果不是我该怎么办?
【发布时间】:2020-03-23 04:14:14
【问题描述】:

假设我有 2 个片段。登录和主页。我将 Home 片段设置为以 userData 作为参数的全局目的地

如果用户还没有登录,那么它将从登录片段开始。登录并从服务器获取 userData 后,它将导航到 Home 并使用此代码传递 userData

 val home = AuthenticationFragmentDirections.actionGlobalHomeFragment(userData)
 Navigation.findNavController(view).navigate(home, navOptions)

但问题是当用户已经登录并打开应用程序时。在这种情况下,他们将直接打开主页片段。我的应用程序因错误而崩溃

java.lang.IllegalArgumentException:必需的参数“userData”是 缺少并且没有 android:defaultValue

所以我假设我可以在 User? 之类的参数中设置可为空的数据类型,因此如果 Home 片段不是来自登录,则不需要 userData

here阅读后,我设置这样的参数来实现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"

【问题讨论】:

  • 您是否有理由不使用 apply plugin: "androidx.navigation.safeargs.kotlin" 在 Kotlin 中生成 Safe Args?
  • 是的,根据文档,这意味着您正在生成 Java 代码 - 您必须使用 .kotlin 来生成 Kotlin 代码。
  • @ianhanniballake 与 apply plugin: 'androidx.navigation.safeargs' 有什么不同吗?我在我的 gradle 应用程序中使用它
  • @ianhanniballake 是的,这就是问题所在。谢谢

标签: android android-architecture-components android-navigation android-architecture-navigation android-jetpack-navigation


【解决方案1】:

当使用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)

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 2015-10-09
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2023-03-15
    • 2022-07-25
    • 2021-11-07
    相关资源
    最近更新 更多