不允许覆盖'writeToParcel'。使用'Parceler'配套对象代替

时间:2017-10-27 15:30:03

标签: android kotlin parcelable parceler

我使用Jetbrains plugin在Kotlin中生成Android Parcelable类,并获得了这两个例外(不是警告,与here不同,所以项目没有构建):

  

CREATOR_DEFINITION_IS_NOT_ALLOWED:'CREATOR'定义不是   允许。请改用“Parceler”伴侣对象。

     

OVERRIDING_WRITE_TO_PARCEL_IS_NOT_ALLOWED:不允许覆盖'writeToParcel'。使用'Parceler'伴侣对象   代替。

我查看了类似的问题,并没有找到任何解决方案。

我的Kotlin版本:1.1.51(根据Gradle的说法),但这个特性在1.1.4中添加:https://blog.jetbrains.com/kotlin/2017/08/kotlin-1-1-4-is-out/

自动生成的代码:

@Parcelize
data class User(
        val id: Int,
        val cardId: String,
        val coefficent: Float = 1.0F,
        val name: String,
        val surname: String = ""
) : Parcelable {
    constructor(source: Parcel) : this(
            source.readInt(),
            source.readString(),
            source.readFloat(),
            source.readString(),
            source.readString()
    )

    companion object {
        @JvmField
        val CREATOR: Parcelable.Creator<User> = object : Parcelable.Creator<User> {
            override fun createFromParcel(source: Parcel): User = User(source)
            override fun newArray(size: Int): Array<User?> = arrayOfNulls(size)
        }
    }

    override fun describeContents() = 0

    override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
        writeInt(id)
        writeString(cardId)
        writeFloat(coefficent)
        writeString(name)
        writeString(surname)
    }
}

1 个答案:

答案 0 :(得分:1)

你可以 使用@Parcelize告诉编译器添加方法,明确地实现它们(由IDEA插件生成或不生成,它没有&# 39; t))。同时拥有两者是没有意义的。

您可以自定义@Parcelize使用的逻辑,但仍然没有通过覆盖方法来完成,但正如https://github.com/Kotlin/KEEP/blob/master/proposals/extensions/android-parcelable.md#custom-parcelables中所描述的那样(&#34;&#34;使用&#39; Parceler&#39;伴侣对象&#34;消息的一部分意味着。)