@Parcelize 在多平台项目中

@Parcelize in multi-platform project

我想在多平台项目中创建一个class,并在Android版本中使用Parcelize使其成为Parcelable

所以在我的 lib-common 项目中,我尝试了:

expect annotation class Parcelize()
expect interface Parcelable

@Parcelize
data class Foo(x: Int): Parcelable

在我的 lib-android 项目中:

actual typealias Parcelize = kotlinx.android.parcel.Parcelize
actual typealias Parcelable = android.os.Parcelable

第一个问题是 Gradle 插件 kotlin-android-extensions 似乎没有接受 lib-androidbuild.gradle,所以包 kotlinx.android.parcel没有找到。我设法通过直接导入库来解决这个问题:

implementation "org.jetbrains.kotlin:kotlin-android-extensions-runtime:$kotlin_version"

有了这个,Parcelableactual 定义编译。

但是,我从 Foo 的定义中得到一个错误,就好像它没有用 @Parcelize:

正确注释一样

Class Foo is not abstract and does not implement abstract member public abstract fun writeToParcel(p0: Parcel!, p1: Int): Unit defined in android.os.Parcelable

嗯,这有点尴尬,但我发现问题仅仅是因为我忘记打开 kotlin-android-extensions 的实验性功能,其中之一是 @Parcelize...

因此,为了使其正常工作,保留问题中我对 ParcelableParcelizeexpectedactual 定义就足够了,并编辑 lib-androidbuild.gradle 并添加以下行:

apply plugin: 'kotlin-android-extensions'
androidExtensions {
    experimental = true
}

不需要 dependencies 添加;那是一个死胡同的方向。

由于 Google 弃用了 android-kotlin-extensions 插件,您应该使用 kotlin-parcelize 插件

apply plugin: 'kotlin-parcelize'

Source