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

问题描述 投票:2回答:3

我有一个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完成这项工作?

kotlin boolean parcelable
3个回答
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

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

关于?.一般。你可以用let操作符重写它

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

甚至更好

dest ?: retrun

2
投票
  1. Kotlin中Java qazxsw poi的语法是qazxsw poi。
  2. isAdmin ? 1 : 0不能合理地是if (isAdmin) 1 else 0,所以你可以改变它的类型dest和所有nullParcel

但真正的答案是:使用?.并让编译器生成所有代码,因此当您添加新属性或导致订单错误时,您不能忘记更改它,或者......


1
投票

1.)使用这个方便的扩展功能:

.

2.)in

@Parcelize

fun Parcel.readBoolean(): Boolean = readByte() > 0 fun Parcel.writeBoolean(bool: Boolean) { writeByte((if (bool) 1 else 0).toByte()) } 是一个平台类型,所以如果你知道它永远不会为null,那么没有理由将它指定为可空类型。

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

© www.soinside.com 2019 - 2024. All rights reserved.