0

我正在尝试将 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
  • 导航安全参数梯度插件:2.3.2
  • androidx.navigation:navigation-ui-ktx: 2.3.2
  • androidx.navigation:navigation-fragment-ktx: 2.3.2
  • kotlinx 序列化核心:1.0.1

提前致谢!

4

3 回答 3

2

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

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

于 2021-01-07T12:55:48.113 回答
1

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

您需要扩展的是标记接口java.io.Serializable,或者android.os.Parcelable是使用活动/片段进行数据传输所必需的。

@Serializable
data class SerializableModel(
    @SerialName("some_value")
    val someValue: String
):java.io.Serializable
于 2021-01-06T19:23:15.833 回答
0

新的Kotlinx Serializable旨在用于在您的应用程序与其后端(云服务器)之间传输数据,而不是在 Android 应用程序中传输数据。请参阅此处的官方答案。

要在Android 应用程序中传输数据,请使用Kotlin ParcelableParcelizeplguin,请参见此处

@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】
于 2021-08-09T14:53:57.503 回答