【问题标题】:@Parcelize in multi-platform project@Parcelize 在多平台项目中
【发布时间】:2018-12-22 10:48:58
【问题描述】:

我想在多平台项目中创建一个类,并在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 正确注释:

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

【问题讨论】:

    标签: android kotlin parcelable kotlin-android-extensions kotlin-multiplatform


    【解决方案1】:

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

    所以为了让它工作,保持我的expectedactual定义ParcelableParcelize就足够了,并编辑lib-androidbuild.gradle并添加以下内容行:

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

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

    【讨论】:

    • 另外,我需要添加依赖: implementation "org.jetbrains.kotlin:kotlin-android-extensions-runtime:$kotlin_version"
    • 您的评论应该添加到这个答案@oguzhan!我也需要这个依赖!
    【解决方案2】:

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

    apply plugin: 'kotlin-parcelize'
    

    Source

    【讨论】:

    • kotlin-pacelize 是 android 特有的吗?
    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2015-07-12
    相关资源
    最近更新 更多