16

在我的 Android 应用程序中,我想将包含下述Place对象的 Bundle 添加到我的 Intent 中。由于可序列化很慢且不推荐,因此我更喜欢 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 Studio 抱怨:

类“Place”不是抽象的,也没有实现抽象成员 public abstract fun writeToParcel(p0: Parcel!, p1: Int): Unit defined in android.os.Parcelable

根据一些教程

就是这样!您不再需要编写任何包裹方法!

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

我不想使用

androidExtensions {
    experimental = true
}

在生产的东西。

我在这里有什么选择?

4

3 回答 3

26

2019 年 19 月 11 日更新

Kotlin 1.3.60及其相应的 Android Studio 插件稳定发布后,问题不再存在。 让我们庆祝一下

更新 27/08/2019

在对全新版本进行更多研究和测试后,似乎该问题将在根据此 YouTrack 问题Kotlin 1.3.50发布时最终得到完全解决Kotlin 1.3.60

编辑 19/06/2019

在 Kotlin 1.3.40 版本中,@Parcelize注释已经过实验并且工作得很好。唯一的问题是一个报告的问题,它使 IDE 变红,这让代码可以完美地编译和运行。

示例代码

示例代码

示例代码

我也用这种对象进行了测试,它也确实有效:

在此处输入图像描述

旧答案

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

杰克·沃顿谈包裹

所以看起来@Parcelize注释将从 开始完全稳定Kotlin 1.3.40。在此之前,您将不得不设置experimental标志。(可悲)


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

于 2019-05-14T16:18:39.640 回答
4

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

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

也许你也得到了这个。

这是解决方案。

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

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

在此处输入图像描述

在此处输入图像描述

如何升级 Kotlin 插件版本?</p>

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

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

在此处输入图像描述

于 2020-02-16T22:38:54.130 回答
0

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

但是,我已经在 prod 环境中使用@Parcelize 一年多了(尽管经过大量测试),没有任何问题。(只是一个意见,并不是说你应该这样做)

于 2019-05-14T15:17:28.487 回答