Generator implementasi parcelable

Plugin kotlin-parcelize menyediakan generator implementasi Parcelable.

Guna menyertakan dukungan untuk Parcelable, tambahkan plugin Gradle ke file build.gradle aplikasi Anda:

Groovy

plugins {
    id 'kotlin-parcelize'
}

Kotlin

plugins {
    id("kotlin-parcelize")
}

Saat Anda menganotasi class dengan @Parcelize, implementasi Parcelable otomatis dibuat, seperti yang ditunjukkan dalam contoh berikut:

import kotlinx.parcelize.Parcelize

@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable

@Parcelize mengharuskan agar semua properti yang diserialisasi dideklarasikan dalam konstruktor utama. Plugin mengeluarkan peringatan di setiap properti dengan kolom pendukung yang dideklarasikan dalam isi class. Selain itu, Anda tidak dapat menerapkan @Parcelize jika beberapa parameter konstruktor utama bukan merupakan properti.

Jika class Anda memerlukan logika serialisasi lanjutan lainnya, tuliskan di dalam class pendamping:

@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
        }
    }
}

Jenis yang didukung

@Parcelize mendukung beragam jenis:

  • Jenis primitif (dan versi box-nya)
  • Objek dan enum
  • String, CharSequence
  • Exception
  • Size, SizeF, Bundle, IBinder, IInterface, FileDescriptor
  • SparseArray, SparseIntArray, SparseLongArray, SparseBooleanArray
  • Semua implementasi Serializable (termasuk Date) dan Parcelable
  • Koleksi semua jenis yang didukung: List (dipetakan ke ArrayList), Set (dipetakan ke LinkedHashSet), Map (dipetakan ke LinkedHashMap)
    • Juga sejumlah implementasi konkret: ArrayList, LinkedList, SortedSet, NavigableSet, HashSet, LinkedHashSet, TreeSet, SortedMap, NavigableMap, HashMap, LinkedHashMap, TreeMap, ConcurrentHashMap
  • Array semua jenis yang didukung
  • Versi nullable semua jenis yang didukung

Parceler kustom

Jika jenis tidak didukung secara langsung, Anda dapat menulis objek pemetaan Parceler untuknya.

class ExternalClass(val value: Int)

object ExternalClassParceler : Parceler<ExternalClass> {
    override fun create(parcel: Parcel) = ExternalClass(parcel.readInt())

    override fun ExternalClass.write(parcel: Parcel, flags: Int) {
        parcel.writeInt(value)
    }
}

Anda dapat menerapkan parceler eksternal menggunakan anotasi @TypeParceler atau @WriteWith:

// Class-local parceler
@Parcelize
@TypeParceler<ExternalClass, ExternalClassParceler>()
class MyClass(val external: ExternalClass) : Parcelable

// Property-local parceler
@Parcelize
class MyClass(@TypeParceler<ExternalClass, ExternalClassParceler>() val external: ExternalClass) : Parcelable

// Type-local parceler
@Parcelize
class MyClass(val external: @WriteWith<ExternalClassParceler>() ExternalClass) : Parcelable

Masukan

Jika mengalami masalah dengan plugin Gradle kotlin-parcelize, Anda dapat melaporkan bug.