المكوّن الإضافي 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
(تم التعيين إلىLinkedHashSet
)،Map
(تم التعيين إلى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، يمكنك
إبلاغنا بالخطأ.