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

我开始使用Kotlin,并试图实现一个parcelable对象,它接收一个字符串列表作为次要构造函数的参数。 但是,我收到错误:

在超类构造函数被调用之前,不能访问“”

这里是我的代码:

class StringChecker(val stringList : List) : 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 { override fun createFromParcel(parcel: Parcel): StringChecker { return StringChecker(parcel) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } 

我明白,我不能在创建对象之前调用成员variablesmStringList,这当然是有道理的,但是readStringList方法需要一个字符串列表参数。 我该如何解决这个问题? 这是我的设计parcelable vs采取list作为构造参数的问题?

对于这个特定的情况,你可以把它写成

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

但是我宁愿只是把它变成工厂方法而不是构造函数。 尤其是因为你无论如何都需要一个工厂方法。 即:

 companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): StringChecker { val stringList = mutableListOf() parcel.readStringList(stringList) return StringChecker(stringList) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } 

还有一些:你可能不想同时拥有stringListmStringList属性,因为你的代码目前是这样做的。 如果它需要是var ,那就改为使用class StringChecker(var stringList : List) 。 也看@Parcelize

你不能在二级构造函数中使用字段。 使用createStringArrayList()而不是readStringList(mStringList)

 constructor(parcel: Parcel) : this(parcel.createStringArrayList())