Android Parcelable不支持默认值App Crash

时间:2019-08-07 16:23:36

标签: android kotlin parcelable

我已经在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)
        }
    }


}

在导航图中将其设置为自定义可打包变量

1 个答案:

答案 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)
}