@Parcelize在多平台项目中

Cac*_*tus 18 android parcelable kotlin kotlin-android-extensions kotlin-multiplatform

我想在多平台项目中创建一个类,并用Parcelize它来制作ParcelableAndroid版本.

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

expect annotation class Parcelize()
expect interface Parcelable

@Parcelize
data class Foo(x: Int): Parcelable
Run Code Online (Sandbox Code Playgroud)

在我的lib-android项目中:

actual typealias Parcelize = kotlinx.android.parcel.Parcelize
actual typealias Parcelable = android.os.Parcelable
Run Code Online (Sandbox Code Playgroud)

第一个问题是,摇篮插件kotlin-android-extensions似乎并没有参加lib-androidbuild.gradle,所以包kotlinx.android.parcel没有被发现.我设法通过直接导入库来解决这个问题:

implementation "org.jetbrains.kotlin:kotlin-android-extensions-runtime:$kotlin_version"
Run Code Online (Sandbox Code Playgroud)

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

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

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

Cac*_*tus 17

嗯,这有点尴尬,但我已经发现问题只是因为我忘了打开实验性功能kotlin-android-extensions,其中一个是@Parcelize......

因此,为了得到它的工作,这是足以让我expectedactual定义Parcelable,并Parcelize作为的问题,和编辑lib-androidbuild.gradle,并添加以下几行:

apply plugin: 'kotlin-android-extensions'
androidExtensions {
    experimental = true
}
Run Code Online (Sandbox Code Playgroud)

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

  • 另外,我需要添加依赖项:实现“org.jetbrains.kotlin:kotlin-android-extensions-runtime:$kotlin_version” (2认同)

Ana*_*K R 6

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

apply plugin: 'kotlin-parcelize'
Run Code Online (Sandbox Code Playgroud)

来源