22

我想在一个多平台项目中创建一个类,并在 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-android's build.gradle,所以kotlinx.android.parcel找不到包。我设法通过直接导入库来解决这个问题:

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

有了这个,编译的actual定义。Parcelable

但是,我从 的定义中得到一个错误Foo,好像它没有正确注释@Parcelize

Foo不是抽象的,也没有实现public abstract fun writeToParcel(p0: Parcel!, p1: Int): Unit定义的抽象成员android.os.Parcelable

4

2 回答 2

21

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

因此,为了让它发挥作用,将我的expectedactual定义保留在问题中就足够了,ParcelableParcelize编辑lib-androidbuild.gradle添加以下行:

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

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

于 2018-07-14T08:48:44.237 回答
6

由于谷歌不推荐使用android-kotlin-extensions插件,你应该使用kotlin-parcelize插件

apply plugin: 'kotlin-parcelize'

来源

于 2021-01-05T08:55:45.880 回答