簡體   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