我已经在Kotlin Parcelable
类中为data
实现了自动生成。相同的类在Entity
中用作Room
,因此我为每个构造函数参数提供了默认值,以便为Room
提供一个空的构造函数。当我尝试将此项作为Parcelable
传递时,应用程序崩溃,并显示UnsupportedOperationException
和此消息
可包裹物品不支持默认值
我现在有解决方法,我只是使用Gson
序列化对象并将其作为String
传递,但是我想知道是否有适当的方法来处理Kotlin和{ {1}}。
这是课程
Parcelable
尝试通过是捆绑销售,崩溃发生在此行。
@Entity
data class ProductData(
//primary key here
@ ColumnInfo val alcoholRestriction: Boolean = false,
@Ignore val averageWeight: Double = 0.0,
@Ignore val hotFoodRestriction: Boolean = false,
@Ignore val maxOrderValue: Double = 0.0,
@Ignore val minOrderValue: Double = 0.0,
@Ignore val orderIncrement: Double = 0.0,
@ColumnInfo var productId: String = "",
@Ignore val stdUomCd: String = "",
@Ignore val uomQty: String = ""
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readByte() != 0.toByte(),
parcel.readDouble(),
parcel.readByte() != 0.toByte(),
parcel.readDouble(),
parcel.readDouble(),
parcel.readDouble(),
parcel.readString(),
parcel.readString(),
parcel.readString()
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeByte(if (alcoholRestriction) 1 else 0)
parcel.writeDouble(averageWeight)
parcel.writeByte(if (hotFoodRestriction) 1 else 0)
parcel.writeDouble(maxOrderValue)
parcel.writeDouble(minOrderValue)
parcel.writeDouble(orderIncrement)
parcel.writeString(productId)
parcel.writeString(stdUomCd)
parcel.writeString(uomQty)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<ProductData> {
override fun createFromParcel(parcel: Parcel): ProductData {
return ProductData(parcel)
}
override fun newArray(size: Int): Array<ProductData?> {
return arrayOfNulls(size)
}
}
}
在导航图中将其设置为自定义可打包变量
答案 0 :(得分:0)
将默认值移至构造函数,无论如何它们几乎都是无用的。布尔值默认为false,并加倍为零。仅字符串需要一些东西。
此外,如果仍要分配默认值,为什么还要使字符串为可空值。
@Entity
data class ProductData(
//primary key here
@ ColumnInfo val alcoholRestriction: Boolean,
@Ignore val averageWeight: Double,
@Ignore val hotFoodRestriction: Boolean,
@Ignore val maxOrderValue: Double,
@Ignore val minOrderValue: Double,
@Ignore val orderIncrement: Double,
@ColumnInfo var productId: String,
@Ignore val stdUomCd: String?,
@Ignore val uomQty: String?
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readByte() != 0.toByte() ?: false,
parcel.readDouble() ?: 0.0,
parcel.readByte() != 0.toByte() ?: false,
parcel.readDouble() ?: 0.0,
parcel.readDouble() ?: 0.0,
parcel.readDouble() ?: 0.0,
parcel.readString() ?: "",
parcel.readString() ?: "",
parcel.readString() ?: ""
)
constructor() : this(
false,
0.0,
false,
0.0,
0.0,
0.0,
"",
"",
"")
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeByte(if (alcoholRestriction) 1 else 0)
parcel.writeDouble(averageWeight)
parcel.writeByte(if (hotFoodRestriction) 1 else 0)
parcel.writeDouble(maxOrderValue)
parcel.writeDouble(minOrderValue)
parcel.writeDouble(orderIncrement)
parcel.writeString(productId)
parcel.writeString(stdUomCd)
parcel.writeString(uomQty)
}