使密封的 class 层次结构可打包

Making sealed class hierarchy Parcelable

我有类似下面的内容,我想将它们作为意图参数传递;

sealed class BasketType : Parcelable {

    class BasketOne(val basketId: String): BasketType() {

        constructor(parcel: Parcel) : this(parcel.readString()) {
        }

        override fun writeToParcel(parcel: Parcel, flags: Int) {
            super.writeToParcel(parcel, flags)
            parcel.writeString(basketId)
        }

        override fun describeContents(): Int {
            return 0
        }

        ...
    }

    ...
}

但是我收到以下错误;

Abstract member cannot be accessed directly

super.writeToParcel(parcel, flags) 行上,这是一种预期。

我四处寻找解决方法,但找不到。有什么想法吗?

您只需省略 super 调用即可。该功能没有超级实现,这就是它抱怨的原因。

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeString(basketId)
}

super 调用之所以存在,是因为 android studio 的代码生成将它放在那里,而没有检查它是否确实可行。

如果你想在 sealed class 中使用 @Parcelize,请这样做:

sealed class AssistantType : Parcelable{
    @Parcelize data class Dashboard(
        val firstName: String,
        val hasGoal: Boolean,
        val hasOverDuePayment: Boolean
    ) : AssistantType()

    @Parcelize data class Detail(
        val firstName: String,
        val isGoalAchived: Boolean
    ) : AssistantType()
}

并将以下代码添加到您的应用级别 gradle。

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

androidExtensions {
    experimental = true
}