kotlin-parcelize
eklentisi
sağlar
Parcelable
uygulama oluşturma aracı.
Parcelable
desteğini dahil etmek için Gradle eklentisini uygulamanızın build.gradle
dosyasına ekleyin:
Eski
plugins { id 'kotlin-parcelize' }
Kotlin
plugins { id("kotlin-parcelize") }
Bir sınıfa @Parcelize
ile ek açıklama eklediğinizde Parcelable
uygulaması
değeri otomatik olarak oluşturulur:
import kotlinx.parcelize.Parcelize
@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable
@Parcelize
, tüm serileştirilmiş özelliklerin
birincil kurucusu. Eklenti, sınıf gövdesinde tanımlanmış bir destek alanı içeren her mülk için uyarı verir. Ayrıca,
Bazı birincil kurucu parametreleri şöyleyse @Parcelize
uygulayın:
değil.
Sınıfınız daha gelişmiş serileştirme mantığı gerektiriyorsa bunu bir tamamlayıcı sınıfa yazın:
@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
}
}
}
Desteklenen türler
@Parcelize
çok çeşitli türleri destekler:
- Temel türler (ve kutulu sürümleri)
- Nesneler ve sıralamalar
String
,CharSequence
Duration
Exception
Size
,SizeF
,Bundle
,IBinder
,IInterface
,FileDescriptor
SparseArray
,SparseIntArray
,SparseLongArray
,SparseBooleanArray
- Tüm
Serializable
(Date
dahil) veParcelable
uygulamaları - Desteklenen tüm türlerin koleksiyonları:
List
(ArrayList
ile eşlenir),Set
(LinkedHashSet
ile eşlenir),Map
(LinkedHashMap
ile eşlenir)- Ayrıca bazı somut uygulamalar:
ArrayList
,LinkedList
,SortedSet
,NavigableSet
,HashSet
,LinkedHashSet
,TreeSet
,SortedMap
,NavigableMap
,HashMap
,LinkedHashMap
,TreeMap
,ConcurrentHashMap
- Ayrıca bazı somut uygulamalar:
- Desteklenen tüm türlerdeki diziler
- Desteklenen tüm türlerin boş değer kabul eden sürümleri
Özel Parceler
'ler
Türünüz doğrudan desteklenmiyorsa Parceler
yazabilirsiniz.
eşleme nesnesini ele alalım.
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)
}
}
@TypeParceler
veya @WriteWith
kullanarak harici paketleri uygulayabilirsiniz
ek açıklamalar:
// 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
Serileştirmeden özellikleri atla
Bir mülkün ayrıştırılmasını atlamak istiyorsanız
@IgnoredOnParcel
ek açıklaması. Ayrıca, belirli bir bölgedeki mülklerde
sınıfın gövdesinin, serileştirilmeyen mülk hakkındaki uyarıları kapatmasını sağlar.
@IgnoredOnParcel
ile açıklama eklenen oluşturucu özelliklerinde bir varsayılan olmalıdır
değer.
@Parcelize
class MyClass(
val include: String,
// Don't serialize this property
@IgnoredOnParcel val ignore: String = "default"
): Parcelable {
// Silence a warning
@IgnoredOnParcel
val computed: String = include + ignore
}
Bir mülkü seri hale getirmek için android.os.Parcel.WriteValue kullanın
Bir türün üzerine @RawValue
ekleyerek Parcelize'in söz konusu mülk için Parcel.writeValue
kullanmasını sağlayabilirsiniz.
@Parcelize
class MyClass(val external: @RawValue ExternalClass): Parcelable
Özelliğin değeri olmazsa bu, çalışma zamanında başarısız olabilir Android tarafından yerel olarak desteklenir.
Ayrıştırma işlemi, başka bir ek açıklama olmadığında da bu ek açıklamayı kullanmanızı yöntemi kullanmayı deneyin.
Korumalı sınıflar ve mühürlü arayüzlerle paketleme
Parselize etmek için bir sınıfın soyut olmaması gerekir. Bu sınırlama
mühürlü sınıflarda geçerli değildir. @Parcelize
ek açıklaması
mühürlü sınıf olarak, türetme sınıfları için tekrarlanmasına gerek yoktur.
@Parcelize
sealed class SealedClass: Parcelable {
class A(val a: String): SealedClass()
class B(val b: Int): SealedClass()
}
@Parcelize
class MyClass(val a: SealedClass.A, val b: SealedClass.B, val c: SealedClass): Parcelable
Geri bildirim
kotlin-parcelize
Gradle eklentisiyle ilgili herhangi bir sorunla karşılaşırsanız şunları yapabilirsiniz:
hata bildiriminde bulunun.