เครื่องมือสร้างการใช้งานแบบพาร์เซล

ปลั๊กอิน 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 โปรดทำดังนี้ รายงานข้อบกพร่อง