Ayrıştırılabilir uygulama oluşturma aracı

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) ve Parcelable 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
  • 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.