@Parcelize 在多平台项目中

Posted

技术标签:

【中文标题】@Parcelize 在多平台项目中【英文标题】:@Parcelize in multi-platform project 【发布时间】: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

【问题讨论】:

【参考方案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 特有的吗?

以上是关于@Parcelize 在多平台项目中的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin用@Parcelize实现序列化Parcelable

Kotlin用@Parcelize实现序列化Parcelable

如何在 SwiftUI 中增加按钮的大小? (多平台项目)

.NET 5.0:在多项目解决方案中构建项目

如何在多项目构建中获取另一个项目的设置值

在多模块项目中读取属性文件