X类不是抽象的,并且没有实现android.os.Parcelable中定义的有趣的writeToParcel()

时间:2019-05-07 08:46:28

标签: parcelable kotlin-android-extensions android-bundle kotlinx.serialisation

在我的Android应用中,我想向我的Intent添加一个Bundle,其中包括如下所述的Place对象。由于可序列化很慢并且不建议使用,因此我更喜欢使用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):定义的单位   在android.os.Parcelable中

根据一些教程

  

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

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

我不想使用

androidExtensions {
    experimental = true
}

在生产中的东西。

我这里有什么替代品?

3 个答案:

答案 0 :(得分:4)

在我的情况下,我已经使用的Kotlin插件版本比1.3.40版本最新。

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

也许你也明白了。

这是解决方案。

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

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

enter image description here

enter image description here

如何升级Kotlin插件版本?

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

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

enter image description here

答案 1 :(得分:0)

如果您不想/不能使用实验性的方法,则始终可以仅实现Parcelable(在类名上执行cmd + enter / alt + enter->“添加Parcelable实现”,以便IDE为您创建方法架构)。扩展程序。

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

答案 2 :(得分:0)

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

Jake Wharton on parcelize

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


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