[英]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)
}
}
還有一些:您可能不希望同時擁有stringList
和mStringList
屬性,就像您的代碼當前所做的那樣。 如果它需要是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.