Parcelize - Hỗ trợ tuyệt vời cho Parcelable

Mở bài

Parcelize được kotlin thêm vào từ version 1.1.4 Theo nguyên văn của Kotlint thì

Android Extensions plugin now includes an automatic Parcelable implementation generator. Declare the serialized properties in a primary constructor and add a @Parcelize annotation, and writeToParcel()/createFromParcel() methods will be created automatically.

Hiểu theo nôm na là chỉ cần bạn thêm annotation Parcelize vào đầu class model thì nó sẽ tự generator các phương thức của Parcelable, làm class của chúng ta nhìn gọn rất nhiều.

Cách thêm Parcelize vào Project

Trong grandle của app chúng ta thêm vào như dưới : apply plugin: ‘kotlin-android-extensions’

androidExtensions {
    experimental = true
}

Ví dụ

Đây là code khi không sử dụng Parcelize

data class Device(@SerializedName("device_id") val deviceId: String,
    @SerializedName("label") val label: String?,
    @SerializedName("home_electronic_id") val homeElectronicId: Int = NaN,
    @SerializedName("type") var type: String? = null) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readString())

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(deviceId)
        parcel.writeString(label)
        parcel.writeInt(homeElectronicId)
        parcel.writeString(type)
    }

    override fun describeContents(): Int = 0

    companion object CREATOR : Parcelable.Creator<Device> {
        override fun createFromParcel(parcel: Parcel): Device {
            return Device(parcel)
        }

        override fun newArray(size: Int): Array<Device?> {
            return arrayOfNulls(size)
        }
    }

}

Chắc ai cũng từng dùng Parcelable thì sẽ nhìn cái này cũng quen rồi, nếu class có nhiều biến hơn thì nó sẽ genrerate dài hơn rất nhiều @@ Còn đây là khi chúng ta sử dụng Parcelize

@Parcelize
data class Device(@SerializedName("device_id") val deviceId: String,
    @SerializedName("label") val label: String?,
    @SerializedName("home_electronic_id") val homeElectronicId: Int = NaN,
    @SerializedName("type") var type: String? = null) : Parcelable {

Nhìn gọn và hơn rất nhiều phải không nào.

Kết bài

Cảm ơn các bạn đã đọc bài viết của mình