منشئ تنفيذ 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
  • Duration
  • 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

تخطّي السمات من التسلسل

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

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

استخدام android.os.Parcel.writeValue لإنشاء تسلسل للخاصية

يمكنك إضافة تعليقات توضيحية إلى نوع باستخدام @RawValue لاستخدام Parcelize. Parcel.writeValue لهذا الموقع الإلكتروني.

@Parcelize
class MyClass(val external: @RawValue ExternalClass): Parcelable

قد يتعذّر تنفيذ ذلك في وقت التشغيل إذا لم تكن قيمة السمة متوافق مع Android في الأصل

قد يتطلب الأمر أيضًا استخدام هذا التعليق التوضيحي في حالة عدم وجود قسم لإنشاء تسلسل للملكية.

استفِد من أقسام آمنة وواجهات محمية

يجب أن يكون حقل الأراضي فئةً كي لا تكون مجردة. يفعل هذا القيد لا تحتفظ به للفئات المغلقة. عند استخدام تعليق @Parcelize التوضيحي على وفئة مختومة، فلا يلزم تكرارها للفئات المشتقة.

@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

ملاحظات

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