【问题标题】:Making sealed class hierarchy Parcelable使密封的类层次结构 Parcelable
【发布时间】:2019-09-05 17:03:43
【问题描述】:

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

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
        }

        ...
    }

    ...
}

但我收到以下错误;

抽象成员不能直接访问

在线super.writeToParcel(parcel, flags) 这是意料之中的。

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

【问题讨论】:

    标签: android-intent kotlin parcelable sealed


    【解决方案1】:

    如果你想在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()
    }
    

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

    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    apply plugin: 'kotlin-kapt'
    
    androidExtensions {
        experimental = true
    }
    

    【讨论】:

    • 谢谢@Adnan,我想把@Parcelize 添加到班级本身就发疯了。那个代码成功了。
    【解决方案2】:

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

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

    super 调用只是因为 android studio 的代码生成将它放在那里而没有检查它是否真的可能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2017-04-23
      • 2019-12-31
      • 2011-05-19
      相关资源
      最近更新 更多