【问题标题】:How to parcelise member variable other than constructor in data class while using @Parcelize使用@Parcelize时如何对数据类中的构造函数以外的成员变量进行parcelize
【发布时间】:2018-11-15 04:00:57
【问题描述】:

我正在使用 Room 和 Kotlin 数据类。比如,

@Entity(tableName = "Person")
@Parcelize
class Test(@ColumnInfo(name = "name") var name:String) : Parcelable{
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "ID")
    var id: Long? = null
}

我可以使用构造函数创建实例并插入数据。我也收到了警告"property would not be serialized into a 'parcel'"。当我尝试通过捆绑发送对象时,缺少 id,正如警告所说的那样,这是预期的。如何在包裹中添加该成员ID?我没有将 ID 保留在构造函数中,因为我希望它们自动生成。

【问题讨论】:

    标签: android kotlin android-room parcelable kotlin-android-extensions


    【解决方案1】:

    您可以通过documentation 找到此信息:

    @Parcelize 要求在主构造函数中声明所有序列化属性。 Android Extensions 将对每个属性发出警告,并在类主体中声明一个支持字段。此外,如果某些主要构造函数参数不是属性,则无法应用 @Parcelize

    如果你的类需要更高级的序列化逻辑,你可以将它写在一个伴生类中:

    @Parcelize
    data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable {
        private companion object : Parceler<User> {
            override fun User.write(parcel: Parcel, flags: Int) {
                // Custom write implementation
            }
    
            override fun create(parcel: Parcel): User {
                // Custom read implementation
            }
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多