繁体   English   中英

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

[英]Creating a Parcelable class with a secondary constructor that takes a list as parameter in Kotlin

我开始使用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与将列表作为构造函数参数的问题吗?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM