ปลั๊กอิน 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
รองรับหลายประเภท ได้แก่
- ประเภทพื้นฐาน (และเวอร์ชันรวมกล่อง)
- ออบเจ็กต์และ Enum
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
ต้องมีค่าเริ่มต้น
@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
ใน
ที่ปิดผนึกแล้ว จะไม่จำเป็นซ้ำสำหรับคลาสที่สืบทอดมา
@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
ความคิดเห็น
หากพบปัญหาเกี่ยวกับปลั๊กอิน Gradle ของ kotlin-parcelize
โปรดทำดังนี้
รายงานข้อบกพร่อง