我有一个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中做到这一点?
答案 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)
Kotlin中Java isAdmin ? 1 : 0
的语法为if (isAdmin) 1 else 0
。
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) {
。