Intereting Posts

Создание класса Parcelable со вторичным конструктором, который принимает список как параметр в 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 требуется параметр списка строк. Как я могу решить эту проблему? Является ли это проблемой моего конструктивного решения по сравнению с выбором списка в качестве параметра конструктора?

В этом конкретном случае вы можете записать это как

 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())