Android Kotlin 创建类实现 Parcelable 在 writeToParcel 方法的“覆盖”中给出错误

Posted

技术标签:

【中文标题】Android Kotlin 创建类实现 Parcelable 在 writeToParcel 方法的“覆盖”中给出错误【英文标题】:Android Kotlin create class implement Parcelable give an error in 'override' of writeToParcel method 【发布时间】:2018-02-16 00:22:44 【问题描述】:

为了使用 Parcelable,我遵循了 Kotlin 1.1.4 的这个版本:https://blog.jetbrains.com/kotlin/2017/08/kotlin-1-1-4-is-out/

在项目中添加这一行

androidExtensions 
    experimental = true

然后定义一个类:

@Parcelize
class User(val firstName: String, val lastName: String) : Parcelable

writeToParcel() 和 createFromParcel() 方法是自动创建的

override fun writeToParcel(parcel: Parcel, flags: Int) 
...

但在带有消息的“覆盖”关键字中仍然存在错误

OVERRIDING_WRITE_TO_PARCEL_IS_NOT_ALLOWED:覆盖“writeToParcel” 不允许。改用“Parceler”伴随对象

你能告诉我正确的方法吗?

编辑: 是否只有在默认构造函数中定义的属性会被添加到 Parcel,而其他的不是?我在这堂课上看到了这个警告。

PROPERTY_WONT_BE_SERIALIZED:属性不会被序列化为 '包裹'。添加 '@Transient' 注释以消除警告

【问题讨论】:

【参考方案1】:

确保您使用的是 kotlin 1.1.4 版本

无需重写 writeToParcel/createFromParcel 方法。 除非你做任何特定的事情。工作室给你错误,但你可以忽略这个错误;皮棉检查尚未更新以了解@Parcelize。对应的 YouTrack 问题在这里:

https://youtrack.jetbrains.com/issue/KT-19300

使用创建类

然后像这样传递

找回来

【讨论】:

如果我定义一个继承parcelable类的子类。需要添加 Parcelize 注解吗? 我从来没有尝试过,但是如果你想序列化子类,请在子类而不是基类中使用 Parcelize。如果不序列化子类,则不需要 Parcelize。你想实现什么?【参考方案2】:

您可以放心地忽略该警告,因为它只是 lint 检查。 现在要摆脱它,只需使用@SuppressLint("ParcelCreator")

例如:

@SuppressLint("ParcelCreator")
@Parcelize
class User(val firstName: String, val lastName: String) : Parcelable

【讨论】:

以上是关于Android Kotlin 创建类实现 Parcelable 在 writeToParcel 方法的“覆盖”中给出错误的主要内容,如果未能解决你的问题,请参考以下文章

如何单独运行一个 kotlin 类

Android kotlin:无法读取类文件

gradle kotlin dsl:如何创建使用插件类的共享函数?

Kotlin 携程。Class类里面创建携程任务 CoroutineScope

用Kotlin实现Android定制视图(KAD 06)

有没有一种方便的方法可以使用 Kotlin 在 Android 中创建 Parcelable 数据类?