2017-12-18 235 views
0

我開始使用Kotlin並嘗試實現一個可接受的對象,該對象接收字符串列表作爲輔助構造函數的參數。然而,我發現了錯誤:創建一個Parcelable類與一個輔助構造函數,該函數將一個列表作爲Kotlin中的參數

Cannot access '< this >' before super class constructor has been called

這裏是我的代碼:

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 vs採取list作爲構造參數的問題?

回答

1

您不能在二級構造函數中使用字段。使用createStringArrayList()代替readStringList(mStringList)

constructor(parcel: Parcel) : this(parcel.createStringArrayList()) 
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

+0

它很有意義。會試試這個。 – alexm

相關問題