منشئ تنفيذ Parcelable

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

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

رائع

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 (تم تعيينه إلى ArrayListSet (تم تعيينه إلى 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، يمكنك الإبلاغ عن خطأ.