android - 不允许覆盖 'writeToParcel'。使用 'Parceler' 伴生对象代替

标签 android kotlin parcelable parceler

我使用了 Jetbrains plugin用于在 Kotlin 中生成 Android Parcelable 类,并得到这两个异常(不是警告,与 here 不同,因此项目无法构建):

CREATOR_DEFINITION_IS_NOT_ALLOWED: 'CREATOR' definition is not allowed. Use 'Parceler' companion object instead.

OVERRIDING_WRITE_TO_PARCEL_IS_NOT_ALLOWED: Overriding 'writeToParcel' is not allowed. Use 'Parceler' companion object instead.

我浏览过类似的问题,但没有找到适合我的情况的解决方案。

我的 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)
    }
}

最佳答案

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

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

关于android - 不允许覆盖 'writeToParcel'。使用 'Parceler' 伴生对象代替,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46978605/

相关文章:

android - 如何在Eclipse中打开Gradle项目?

java - ImageView 未以线性布局显示(android)

java - 使用 GridView 制作日历

android - View.VISIBLE和INVISIBLE不起作用Kolin

java - 放在 Intent/bundle 中的一些 Parcelables 对象可能会 self 干扰并影响 Intent/Bundle 的读取?

android - 读取可打包对象时出错(应用程序恢复后)

java - 在 android 中出现关于 sdk 版本的错误

android - 如何使用 Koin 对 MVVM 进行单元测试?

kotlin - 我对以下 Kotlin 声明感到困惑

java - 如何从类型变量中获取 ClassLoader(用于使用泛型打包类)