Plugin kotlin-parcelize
menyediakan generator implementasi Parcelable
.
Saat Anda menganotasi class dengan @Parcelize
, implementasi Parcelable
otomatis dibuat, seperti yang ditunjukkan dalam contoh berikut:
import kotlinx.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
(termasukDate
) danParcelable
- Koleksi semua jenis yang didukung:
List
(dipetakan keArrayList
),Set
(dipetakan keLinkedHashSet
),Map
(dipetakan keLinkedHashMap
)- Juga sejumlah implementasi konkret:
ArrayList
,LinkedList
,SortedSet
,NavigableSet
,HashSet
,LinkedHashSet
,TreeSet
,SortedMap
,NavigableMap
,HashMap
,LinkedHashMap
,TreeMap
,ConcurrentHashMap
- Juga sejumlah implementasi konkret:
- 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)
// Property-local parceler
@Parcelize
class MyClass(@TypeParceler<ExternalClass, ExternalClassParceler>() val external: ExternalClass)
// Type-local parceler
@Parcelize
class MyClass(val external: @WriteWith<ExternalClassParceler>() ExternalClass)
Masukan
Jika mengalami masalah dengan plugin kotlin-parcelize
, Anda dapat melaporkan bug.