使用辅助构造函数创建一个Parcelable类,该构造函数将列表作为Kotlin中的参数

问题描述 投票:1回答:2

我开始使用Kotlin并尝试实现一个可接受的对象,该对象接收一个字符串列表作为辅助构造函数的参数。但是,我收到错误:

在调用超类构造函数之前无法访问“<this>”

这是我的代码:

class StringChecker(val stringList : List<String>) : Parcelable {

    var mStringList = stringList

    constructor(parcel: Parcel) : this(parcel.readStringList(mStringList))

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeStringList(mStringList)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<StringChecker> {
        override fun createFromParcel(parcel: Parcel): StringChecker {
            return StringChecker(parcel)
        }

        override fun newArray(size: Int): Array<StringChecker?> {
            return arrayOfNulls(size)
        }
    }

}

我知道在创建对象之前我无法调用成员变量mStringList,这当然有意义,但readStringList方法需要字符串列表参数。我该如何解决这个问题?这是我的设计parcelable与将列表作为构造函数参数的问题吗?

android list kotlin parcelable
2个回答
2
投票

对于这种特定情况,您可以将其写为

constructor(parcel: Parcel) : this(mutableListOf<String>()) {
  parcel.readStringList(mStringList)
}

但我更愿意只是使它成为工厂方法,而不是构造函数。特别是因为无论如何你需要它用于工厂方法。即:

companion object CREATOR : Parcelable.Creator<StringChecker> {
    override fun createFromParcel(parcel: Parcel): StringChecker {
        val stringList = mutableListOf<String>()
        parcel.readStringList(stringList)
        return StringChecker(stringList)
    }

    override fun newArray(size: Int): Array<StringChecker?> {
        return arrayOfNulls(size)
    }
}

还有一些:您可能不希望同时拥有stringListmStringList属性,就像您的代码目前所做的那样。如果它需要是var,只需改为class StringChecker(var stringList : List<String>)。还看看@Parcelize


1
投票

您不能在辅助构造函数中使用字段。使用createStringArrayList()而不是readStringList(mStringList)

constructor(parcel: Parcel) : this(parcel.createStringArrayList())
© www.soinside.com 2019 - 2024. All rights reserved.