הפלאגין 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
אם חלק מהפרמטרים של ה-constructor הראשי
ולא נכסים.
אם הכיתה דורשת לוגיקה מתקדמת יותר של סריאליזציה, כותבים אותה במחלקה נלווית:
@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
יש תמיכה במגוון רחב של סוגים:
- סוגים פרימיטיביים (והגרסאות שהם ארוזות)
- אובייקטים וטיפוסים בני מנייה (enums)
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
משוב
אם נתקלת בבעיות בפלאגין kotlin-parcelize
Gradle, אפשר לבצע את הפעולות הבאות
דיווח על באג.