منشئ تنفيذ Parcelable

المكوّن الإضافي kotlin-parcelize لتوفير أداة إنشاء تنفيذ Parcelable.

لتضمين الدعم لـ Parcelable، أضِف مكوّن Gradle الإضافي إلى ملف build.gradle للتطبيق:

Groovy

plugins {
    id 'kotlin-parcelize'
}

Kotlin

plugins {
    id("kotlin-parcelize")
}

عند إضافة تعليق توضيحي إلى صف باستخدام @Parcelize، يتم تنفيذ Parcelable يتم إنشاؤه تلقائيًا، كما هو موضح في المثال التالي:

import kotlinx.parcelize.Parcelize

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

تتطلب الدالة @Parcelize الإعلان عن جميع السمات المتسلسلة في الدالة الإنشائية الأساسية. تُصدر الإضافة تحذيرًا على كل موقع مع وجود حقل خلفي معلن عنه في نص الفئة. أيضًا، لا يمكنك تطبيق @Parcelize إذا كانت بعض مَعلمات الدالة الإنشائية الأساسية وليس الخصائص.

إذا كان صفك يتطلب منطق تسلسل أكثر تقدمًا، اكتبه داخل فئة مصاحبة:

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

الأنواع المتوافقة

يتوافق "@Parcelize" مع مجموعة كبيرة من أنواع المحتوى:

  • الأنواع الأولية (وإصداراتها في علبة)
  • العناصر والتعدادات
  • String، CharSequence
  • Exception
  • Size، SizeF، Bundle، IBinder، IInterface، FileDescriptor
  • SparseArray، SparseIntArray، SparseLongArray، SparseBooleanArray
  • كل عمليات تنفيذ Serializable (بما في ذلك Date) وParcelable
  • المجموعات من كل الأنواع المتوافقة: List (تم تعيينها إلى ArrayList) وSet (تم التعيين إلى LinkedHashSetMap (تم التعيين إلى LinkedHashMap)
    • هناك أيضًا عدد من عمليات التنفيذ الملموسة: ArrayList، LinkedList، SortedSet وNavigableSet وHashSet وLinkedHashSet وTreeSet SortedMap وNavigableMap وHashMap، وLinkedHashMap، وTreeMap، ConcurrentHashMap
  • صفائف من جميع الأنواع المتوافقة
  • الإصدارات الفارغة من كل الأنواع المتوافقة

Parceler مخصصة

إذا لم يكن نوعك متاحًا بشكل مباشر، يمكنك كتابة Parceler كائن تعيين له.

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 أو @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

ملاحظات

إذا واجهت أي مشاكل في مكوّن Gradle الإضافي kotlin-parcelize، يمكنك الإبلاغ عن خطأ.