【问题标题】:How to use Navigation Safe Args with Kotlinx serializable data如何将 Navigation Safe Args 与 Kotlinx 可序列化数据一起使用
【发布时间】:2021-01-06 18:24:09
【问题描述】:

我正在尝试将 Navigation Safe Args 与 Kotlinx @Serializable 类型一起使用,但在运行时传递可序列化数据时,我一直遇到同样的问题:

Caused by: java.lang.IllegalArgumentException: com.example.serializablesafeargsnavigation.shared.Model.SerializableModel is not Serializable or Parcelable.

在我的 nav_graph.xml 我有以下内容:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/firstFragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.example.serializablesafeargsnavigation.androidApp.FirstFragment"
        android:label="FirstFragment" >
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>

    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.serializablesafeargsnavigation.androidApp.SecondFragment"
        android:label="SecondFragment">
        <argument
            android:name="arg"
            app:argType="com.example.serializablesafeargsnavigation.shared.Model.SerializableModel" />
    </fragment>
</navigation>

我的 SerializableModel 看起来像这样:

@Serializable
data class SerializableModel(
    @SerialName("some_value")
    val someValue: String
)

有没有人找到解决方法来使用 Safe Args 进行这项工作。如果您使用导航 API 传递 Bundle,它会起作用,但如果可能,我想使用 Safe Args。

我正在使用的版本

  • plugin.serialization: 1.4.21
  • navigation-safe-args-gradle-plugin: 2.3.2
  • androidx.navigation:navigation-ui-ktx: 2.3.2
  • androidx.navigation:navigation-fragment-ktx: 2.3.2
  • kotlinx-序列化核心:1.0.1

提前致谢!

【问题讨论】:

  • 请分享一些代码,以便理解。
  • @rahat 感谢您的意见!我用一些代码更新了帖子。

标签: android android-architecture-navigation kotlin-multiplatform kotlinx.serialization android-safe-args


【解决方案1】:

如果您的模型在共享模块中,您可能无法使用 jvmandroid 依赖项。

您可以创建自己的 parcelize expect/actual 抽象,也可以使用 moko-parcelize,其本质上是相同的

【讨论】:

    【解决方案2】:

    原因:java.lang.IllegalArgumentException:com.example.serializablesafeargsnavigation.shared.Model.SerializableModel 不是 Serializable 或 Parcelable。

    您需要扩展的是标记接口java.io.Serializableandroid.os.Parcelable,它们是与活动/片段进行数据传输所必需的。

    @Serializable
    data class SerializableModel(
        @SerialName("some_value")
        val someValue: String
    ):java.io.Serializable
    

    【讨论】:

      【解决方案3】:

      新的 KotlinxSerializable 设计用于在您的应用与其后端(云服务器)之间传输数据,不适用于在 Android 应用中传输数据。请参阅官方回复here.

      要在 Android 应用 中传输数据,请使用 Kotlin ParcelableParcelize plguin,请参阅 here

      @Parcelize        //add annotaion for simplifing parcelizing process
      data class MarsProperty(
          val id: String,
          val type: String,
          val price: Double
      ) : Parcelable    //implement Parcelable interface, 【must have to be recognized as Custom Parcelable object in safe args】
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-23
        • 1970-01-01
        • 2019-05-02
        • 2020-05-17
        • 1970-01-01
        • 2021-03-25
        • 2020-11-05
        • 1970-01-01
        相关资源
        最近更新 更多