如何将 Navigation Safe Args 与 Kotlinx 可序列化数据一起使用
How to use Navigation Safe Args with Kotlinx serializable data
-
android
-
kotlin-multiplatform
-
android-architecture-navigation
-
android-safe-args
-
kotlinx.serialization
我正在尝试将 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
- 导航安全参数-gradle-插件:2.3.2
- androidx.navigation:导航-ui-ktx:2.3.2
- androidx.navigation:导航片段-ktx:2.3.2
- kotlinx-序列化核心:1.0.1
提前致谢!
原因:java.lang.IllegalArgumentException:com.example.serializablesafeargsnavigation.shared.Model.SerializableModel 不可序列化或可打包。
您需要扩展的是 Marker 接口 java.io.Serializable
或 android.os.Parcelable
,这是与活动/片段进行数据传输所必需的。
@Serializable
data class SerializableModel(
@SerialName("some_value")
val someValue: String
):java.io.Serializable
如果您的模型在共享模块中,您可能无法使用 jvm 和 android依赖项。
您可以创建自己的 parcelize expect/actual
抽象,或者您可以使用 moko-parcelize,这在本质上是相同的
新的 Kotlinx Serializable
设计用于在您的应用与其后端(云服务器)之间传输数据,不适用于传输数据在 Android App. 中查看官方答案 here。
为了在 Android app 中传输数据,使用 Kotlin Parcelable
和 Parcelize
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】
android
kotlin-multiplatform
android-architecture-navigation
android-safe-args
kotlinx.serialization
我正在尝试将 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
- 导航安全参数-gradle-插件:2.3.2
- androidx.navigation:导航-ui-ktx:2.3.2
- androidx.navigation:导航片段-ktx:2.3.2
- kotlinx-序列化核心:1.0.1
提前致谢!
原因:java.lang.IllegalArgumentException:com.example.serializablesafeargsnavigation.shared.Model.SerializableModel 不可序列化或可打包。
您需要扩展的是 Marker 接口 java.io.Serializable
或 android.os.Parcelable
,这是与活动/片段进行数据传输所必需的。
@Serializable
data class SerializableModel(
@SerialName("some_value")
val someValue: String
):java.io.Serializable
如果您的模型在共享模块中,您可能无法使用 jvm 和 android依赖项。
您可以创建自己的 parcelize expect/actual
抽象,或者您可以使用 moko-parcelize,这在本质上是相同的
新的 Kotlinx Serializable
设计用于在您的应用与其后端(云服务器)之间传输数据,不适用于传输数据在 Android App. 中查看官方答案 here。
为了在 Android app 中传输数据,使用 Kotlin Parcelable
和 Parcelize
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】