我有一个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
。我如何在Kotlin完成这项工作?
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
isAdmin ? 1 : 0
不能合理地是if (isAdmin) 1 else 0
,所以你可以改变它的类型dest
和所有null
到Parcel
。但真正的答案是:使用?.
并让编译器生成所有代码,因此当您添加新属性或导致订单错误时,您不能忘记更改它,或者......
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) {
。