6

我使用 Jetbrains插件在 Kotlin 中生成 Android Parcelable 类,并得到了这两个异常(不是警告,不像这里,所以项目没有构建):

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)
    }
}
4

1 回答 1

5

您可以使用告诉@Parcelize编译器添加方法,显式实现它们(是否由 IDEA 插件生成,没关系)。同时拥有两者是没有意义的。

您可以自定义由 使用的逻辑@Parcelize,但仍然不是通过覆盖方法来完成,而是如https://github.com/Kotlin/KEEP/blob/master/proposals/extensions/android-parcelable.md#custom-parcelables中所述(这就是消息的“使用'Parceler'伴随对象”部分的意思)。

于 2017-10-27T16:00:56.013 回答