المكوّن الإضافي 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
(تم التعيين إلى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
ملاحظات
إذا واجهت أي مشاكل في مكوّن Gradle الإضافي kotlin-parcelize
، يمكنك
الإبلاغ عن خطأ.