微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将导航安全参数与 Kotlinx 可序列化数据一起使用

如何解决如何将导航安全参数与 Kotlinx 可序列化数据一起使用

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

提前致谢!

解决方法

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

您可以创建自己的parcelize expect/actual 抽象,也可以使用moko-parcelize,它们的作用基本相同

,

引起: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
,

新的 Kotlinx Serializable 旨在用于在您的应用与其后端(云服务器)之间传输数据,不适用于在 Android 应用内传输数据。 查看官方回答 here

要在 Android 应用程序内传输数据,请使用 Kotlin ParcelableParcelize 插件,请参阅 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】

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。