如何将 Navigation Safe Args 与 Kotlinx 可序列化数据一起使用

How to use Navigation Safe Args with Kotlinx serializable data

我正在尝试将 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。

我使用的版本

提前致谢!

原因:java.lang.IllegalArgumentException:com.example.serializablesafeargsnavigation.shared.Model.SerializableModel 不可序列化或可打包。

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

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

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

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

新的 Kotlinx Serializable 设计用于在您的应用与其后端(云服务器)之间传输数据,不适用于传输数据在 Android App. 中查看官方答案 here

为了在 Android app 中传输数据,使用 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】