3

我正在尝试将 safe-args 与 kotlin-multiplatform 类型一起使用,但是在尝试传递可序列化数据时,我在运行时不断遇到同样的问题:

引起:java.lang.IllegalArgumentException:org.kotlin.mpp.mobile.models.MyModel 不是 Serializable 或 Parcelable。

在我的nav_host.xml我有以下内容:

<fragment
    android:id="@+id/aFragment"
    android:name="com.corp.myapp.main.aFragment"
    android:label="aFragment" >
    <action
        android:id="@+id/action_aFragment_to_bFragment"
        app:destination="@id/bFragment"
        app:popUpTo="@id/bFragment"
        app:popUpToInclusive="true">
        <argument
            android:name="myname"
            app:argType="org.kotlin.mpp.mobile.models.MyModel"
            app:nullable="true" />
    </action>
</fragment>

我现在使用的两种方法得到了完全相同的异常。

第一个是使用kotlinx-serialization插件,我有以下类型:

package org.kotlin.mpp.mobile.models

import kotlinx.serialization.Serializable

@Serializable
data class MyModel(val first: String = "", val last: String = "")

第二个我尝试的第一个不起作用是使用以下扩展java.io.Serializable制作一个特定于平台的(JVM)实现:

commondataModels.kt:

package org.kotlin.mpp.mobile.models

expect class MyModel(first: String, last: String)

实际数据模型.kt:

package org.kotlin.mpp.mobile.models

import java.io.Serializable

actual data class MyModel actual constructor(val first: String, val last: String): Serializable

我正在使用生成的方向类在我的 Activity 中进行导航调用:

import org.kotlin.mpp.mobile.models.*


val user = MyModel("Bruce","Lee")
host.findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment(user))

提前感谢您的任何建议!

注意:我可以通过使用导航 API传递 Bundle 来使一切正常工作,但是我希望它可以与安全参数一起使用。

4

2 回答 2

2

正如 CommonsWare 建议的那样,使用 @Parcelize(以及扩展名 Parcelable)

在此处输入图像描述

诀窍是确保 Parcelable 不会破坏您的公共代码,因为这是 Android 唯一的概念。为此,在您的常用代码中添加

期望接口 Parcelable

也:

@UseExperimental(ExperimentalMultiplatform::class) @OptionalExpectation @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.BINARY) 期望注解类 Parcelize()

看起来像这样: 在此处输入图像描述

然后在您的 Android 源代码集中,实际使用 typealias:

实际类型别名 Parcelable = android.os.Parcelable

实际类型别名 Parcelize = kotlinx.android.parcel.Parcelize

在其他源集(例如iOS)中,只需将其变为实际:

实际界面 Parcelable

于 2020-04-09T23:43:55.347 回答
0
  1. 新的Kotlinx Serializable

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

  1. 旧的Java SerializableAndroid Parcelable

    • Java SerializableAndroid Parcelable慢,看这个这个

    • Kotlin Parcelize插件简化了Android Parcelable的设置,看这个。只需要注释并从中扩展(被识别为Custom Parcelablesafe args

于 2021-08-09T14:31:58.660 回答