Как сохранить логическое свойство для интерфейса Parcelable? - PullRequest
2 голосов
/ 05 апреля 2019

У меня есть data объект, User.Одним из свойств User является Boolean.Я не могу понять, как хранить это Boolean, поскольку нет такого writeBoolean(), поставляемого из коробки.

Из того, что я искал в Интернете, одним из способов хранения свойства Boolean является использование метода writeInt() и троичного оператора.

Итак, я попробовал это здесь:

data class User(val contactNumber: String,
                val email: String,
                val fullName: String,
                val isAdmin: Boolean,
                val organization: String,
                val unitNumber: String) : Parcelable {

override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.writeString(contactNumber)
        dest?.writeString(email)
        dest?.writeString(fullName)
        dest?.writeInt(isAdmin ? 1 : 0)
        dest?.writeString(organization)
        dest?.writeString(unitNumber)
    }

}

Но этот синтаксис работает только с Java, а не с Kotlin.Я получаю сообщение об ошибке компилятора, указывающее Unexpected tokens (use ':' to separate expressions on the same line.Как мне сделать это в Котлине?

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019
  1. Синтаксис для Java isAdmin ? 1 : 0 в Kotlin: if (isAdmin) 1 else 0.

  2. dest не может быть разумно null, поэтому вы можете изменить его тип на Parcel и все ?. на ..

Но реальный ответ таков: используйте @Parcelize и позвольте компилятору сгенерировать весь этот код, чтобы вы не могли забыть изменить его при добавлении новых свойств или получить заказ неправильно, или ...

2 голосов
/ 05 апреля 2019

Тернарный оператор не поддерживается в kotlin Вместо этого используйте if-else

writeInt(if(isAdmin) 1 else 0)

Я использую writeValue вместо этого, это также полезно для переменных, допускающих значение Nullable

dest.writeValue(this.booleanVar)
booleanVar = parcel.readValue(Boolean::class.java.classLoader) as? Boolean? 

если это может быть обнуляемо и если нет, то добавьте ?: false

upd : как указано в других ответах dest переменная не может быть нулевой. afaik помечается как обнуляемый после преобразования кода с помощью Android Studio Если вы используете эту функцию, лучше дважды проверить свой код, потому что преобразование может иногда работать неправильно.

О ?. в целом. Вы можете переписать его с помощью let оператора

dest?.let { it ->
  it.write(....)

или даже лучше

dest ?: retrun
1 голос
/ 05 апреля 2019

1.) Используйте эту удобную функцию расширения:

fun Parcel.readBoolean(): Boolean = readByte() > 0

fun Parcel.writeBoolean(bool: Boolean) {
    writeByte((if (bool) 1 else 0).toByte())
}

2.) В

override fun writeToParcel(dest: Parcel?, flags: Int) {

dest: Parcel! - это тип платформы , поэтому, если вы знаете, что никогда не будет нулевым, то нет нужды указывать его как обнуляемый тип.

Вместо этого используйте override fun writeToParcel(dest: Parcel, flags: Int) {.

...