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