如何为Parcelable接口存储布尔属性?

时间:2019-04-05 08:43:22

标签: kotlin boolean parcelable

我有一个data对象UserUser的属性之一是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的编译器错误。我如何在Kotlin中做到这一点?

3 个答案:

答案 0 :(得分:2)

kotlin不支持三元运算符 使用if-else代替

writeInt(if(isAdmin) 1 else 0)

我改用writeValue,它对于可为空的变量也很有用

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

如果它可以为空并且不能添加?: false

更新:如其他答案dest所述,变量不能为null。 afaik在使用Android Studio进行代码转换后将其标记为可空。如果您最好使用该功能仔细检查代码,因为有时转换可能无法正常工作。

关于?.的概述。您可以使用let运算符

将其重写
dest?.let { it ->
  it.write(....)

甚至更好

dest ?: retrun

答案 1 :(得分:2)

  1. Kotlin中Java isAdmin ? 1 : 0的语法为if (isAdmin) 1 else 0

  2. dest不能合理地称为null,因此您可以将其类型更改为Parcel,并将所有?.更改为.。 / p>

但是真正的答案是:使用@Parcelize并让编译器生成所有代码,因此您不能忘记添加新属性或获得命令时对其进行更改错误,或者...

答案 2 :(得分:1)

1。)使用此便捷的扩展功能:

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

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

2。)in

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

dest: Parcel!平台类型,因此,如果您知道它将 从不 为空,则原因为零将其指定为可为空的类型。

改为使用override fun writeToParcel(dest: Parcel, flags: Int) {