如何解决如何将导航安全参数与 Kotlinx 可序列化数据一起使用
我正在尝试将 Navigation Safe Args 与 Kotlinx @Serializable 类型一起使用,但是在运行时传递可序列化数据时,我一直遇到同样的问题:
Caused by: java.lang.IllegalArgumentException: com.example.serializablesafeargsnavigation.shared.Model.SerializableModel is not Serializable or Parcelable.
<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
提前致谢!
解决方法
如果您的模型在共享模块中,您可能无法使用 jvm 和 android 依赖项。
您可以创建自己的parcelize expect/actual
抽象,也可以使用moko-parcelize,它们的作用基本相同
引起: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
,
新的 Kotlinx Serializable
旨在用于在您的应用与其后端(云服务器)之间传输数据,不适用于在 Android 应用内传输数据。 查看官方回答 here。
要在 Android 应用程序内传输数据,请使用 Kotlin Parcelable
和 Parcelize
插件,请参阅 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 举报,一经查实,本站将立刻删除。