使密封类层次结构 Parcelable

std*_*out 5 sealed parcelable android-intent kotlin

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

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
        }

        ...
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误;

不能直接访问抽象成员

就在super.writeToParcel(parcel, flags)预料之中。

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

Adn*_*aki 31

如果你想@parcelizesealed class,这样做:

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()
}
Run Code Online (Sandbox Code Playgroud)

并将以下代码添加到您的 App Level gradle 中。

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

androidExtensions {
    experimental = true
}
Run Code Online (Sandbox Code Playgroud)


zap*_*apl 4

您只需忽略该super呼叫即可。该函数没有超级实现,这就是它抱怨的原因。

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeString(basketId)
}
Run Code Online (Sandbox Code Playgroud)

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