Class X 不是抽象的,没有实现 android.os.Parcelable 中定义的 fun writeToParcel()

Class X is not abstract and does not implement fun writeToParcel() defined in android.os.Parcelable

在我的 Android 应用程序中,我想向我的 Intent 添加一个包含下面描述的 Place 对象的 Bundle。由于 serializable 速度慢且不推荐,我更喜欢 Parcelable。

虽然我使用 Kotlin 1.3.31,但我在分割一些数据时遇到问题 类。示例:

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Place(val street: String, val postal: String, val city: String) : Parcelable

和Android工作室抱怨:

Class 'Place' is not abstract and does not implement abstract member public abstract fun writeToParcel(p0: Parcel!, p1: Int): Unit defined in android.os.Parcelable

根据一些教程

That’s it! You don’t need to write any parcel methods anymore!

https://android.jlelse.eu/yet-another-awesome-kotlin-feature-parcelize-5439718ba220

而且我不想使用

androidExtensions {
    experimental = true
}

在生产方面。

我在这里有什么选择?

你总是可以实现 Parcelable(cmd+enter/alt+enter on class name -> `Add Parcelable Implementation" 以便 IDE 为你创建方法模式) 如果您不想to/can不使用实验性扩展。

然而,我已经在生产环境中使用@Parcelize(虽然经过大量测试)一年多了,没有任何问题。(虽然只是一个意见,并不是说你应该)

2019 年 11 月 19 日更新

Kotlin 1.3.60 及其对应的 Android Studio 插件稳定发布后,问题不再存在。 Let's celebrate

2019 年 8 月 27 日更新

在对全新的 Kotlin 1.3.50 进行更多的研究和测试之后,似乎这个问题将在他们发布 Kotlin 1.3.60 as per this YouTrack issue[=26= 时最终完全解决]

编辑 2019 年 6 月 19 日

随着 Kotlin 1.3.40 的发布,@Parcelize 注释已经过实验并且工作得很好。唯一的问题是报告的 issue 使 IDE 变红,把它放在一边,代码确实编译并且 运行 完美。

我也测试过这种对象,它确实有效:

旧答案

我面临着完全相同的问题,在调查时我发现了这个:

因此看起来 @Parcelize 注释将从 Kotlin 1.3.40 开始完全稳定。在那之前,您必须设置 experimental 标志。 (悲伤)


他们错误地将 @Parcelize 推到了实验性功能之外,您仍然会遇到编译错误。

在我的场景中,我已经使用了高于1.3.40的Kotlin插件版本。

但我仍然遇到 Android Studio 错误,编译成功但是 IDE 抱怨 @Parcelize注释.

也许你也明白了。

这是解决方案。

检查您在 Gradle 中配置的 Kotlin 插件版本是否与 Android Studio 中捆绑的版本相同。

我收到错误是因为我的 Gradle koltin 插件版本是 1.3.61 而 Android Studio 捆绑版本是 1.3.50

如何升级kotlin插件版本?

工具 -> Kotlin -> 配置 kotlin 插件更新

检查最新版本并安装,保持两个版本相同