पार्स किया जा सकने वाला लागू करने वाला जनरेटर

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
  • 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 के साथ व्याख्या की जा सकती है उस प्रॉपर्टी के लिए Parcel.writeValue.

@Parcelize
class MyClass(val external: @RawValue ExternalClass): Parcelable

अगर प्रॉपर्टी की वैल्यू नहीं है, तो रनटाइम के दौरान ऐसा हो सकता है Android पर स्थानीय तौर पर काम करता हो.

हो सकता है कि प्रॉपर्टी को सीरियलाइज़ करने का कोई दूसरा तरीका न होने पर, पार्सल करने के लिए भी आपको इस एनोटेशन का इस्तेमाल करना पड़े.

सील की गई क्लास और सील किए गए इंटरफ़ेस की मदद से पार्सल करें

पार्सलाइज़ करने के लिए क्लास को पार्स करना होता है, ताकि ऐब्स्ट्रैक्ट नहीं बनाया जा सके. इस सीमा से ये काम किए जा सकते हैं सील की गई क्लास के लिए न रखें. जब @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

सुझाव

अगर आपको kotlin-parcelize Gradle प्लग इन में कोई समस्या आती है, तो ये काम किए जा सकते हैं गड़बड़ी की शिकायत करें.