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