kotlin - 如何在 Parcelable 中创建可为空的布尔值
kotlin - how to make a nullable boolean within a Parceable
拥有一个 Parcelable class,其可空布尔值内存默认为 null
可以这样
parcel.writeByte(if (isAllowed==null) -1 else (if (isAllowed) 1 else 0))
但是如何取回它并在构造函数中传递它?
是否有更好的方法来 serialize/deserialize 可为 null 的布尔值?
class Config(val isAllowed: Boolean?=null, val startPos: Int=-1 ) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readByte() != 0.toByte(),
parcel.readInt()
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeByte(if (isAllowed) 1 else 0)
parcel.writeInt(startPos)
}
......
您可以使用 .let{}
来 return 计算值。
constructor(parcel: Parcel) : this(parcel.readByte().let { if(it < 0) null else (it > 0) },parcel.readInt())
您需要一种从 Parcel
创建 Config
的方法,但它不一定是构造函数,即使大多数示例都这样做。在你的 CREATOR
:
fun createFromParcel(parcel: Parcel): Config {
val parcelByte = parcel.readByte()
val isAllowed = if (parcelByte < 0) null else parcelByte > 0
val startPos = parcel.readInt()
return Config(isAllowed, startPos)
}
显然,如果您不止一次需要它,可以将其提取到 fun Parcel.read(write)NullableBoolean()
中。
或者直接使用 @Parcelize
:)
拥有一个 Parcelable class,其可空布尔值内存默认为 null
可以这样
parcel.writeByte(if (isAllowed==null) -1 else (if (isAllowed) 1 else 0))
但是如何取回它并在构造函数中传递它?
是否有更好的方法来 serialize/deserialize 可为 null 的布尔值?
class Config(val isAllowed: Boolean?=null, val startPos: Int=-1 ) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readByte() != 0.toByte(),
parcel.readInt()
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeByte(if (isAllowed) 1 else 0)
parcel.writeInt(startPos)
}
......
您可以使用 .let{}
来 return 计算值。
constructor(parcel: Parcel) : this(parcel.readByte().let { if(it < 0) null else (it > 0) },parcel.readInt())
您需要一种从 Parcel
创建 Config
的方法,但它不一定是构造函数,即使大多数示例都这样做。在你的 CREATOR
:
fun createFromParcel(parcel: Parcel): Config {
val parcelByte = parcel.readByte()
val isAllowed = if (parcelByte < 0) null else parcelByte > 0
val startPos = parcel.readInt()
return Config(isAllowed, startPos)
}
显然,如果您不止一次需要它,可以将其提取到 fun Parcel.read(write)NullableBoolean()
中。
或者直接使用 @Parcelize
:)