@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-android
的build.gradle
,所以找不到包kotlinx.android.parcel
。我设法通过直接导入库来解决这个问题:
implementation "org.jetbrains.kotlin:kotlin-android-extensions-runtime:$kotlin_version"
这样,Parcelable
的 actual
定义就可以编译了。
但是,我从Foo
的定义中得到一个错误,好像它没有用@Parcelize
正确注释:
类
Foo
不是抽象的,也没有实现android.os.Parcelable
中定义的抽象成员public abstract fun writeToParcel(p0: Parcel!, p1: Int): Unit
【问题讨论】:
【参考方案1】:好吧,这有点尴尬,但我发现问题只是因为我忘记打开kotlin-android-extensions
的实验功能,其中一个是@Parcelize
...
所以为了让它工作,保持我的expected
和actual
定义Parcelable
和Parcelize
就足够了,并编辑lib-android
的build.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