kotlin-parcelize
প্লাগইন একটি Parcelable
বাস্তবায়ন জেনারেটর প্রদান করে।
Parcelable
জন্য সমর্থন অন্তর্ভুক্ত করতে, আপনার অ্যাপের build.gradle
ফাইলে Gradle প্লাগইন যোগ করুন:
গ্রোভি
plugins { id 'kotlin-parcelize' }
কোটলিন
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
বিভিন্ন ধরনের সমর্থন করে:
- আদিম প্রকার (এবং তাদের বক্সযুক্ত সংস্করণ)
- বস্তু এবং enums
-
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
পার্সেল থেকে ডেটা তৈরি করুন
জাভা কোডে, আপনি সরাসরি CREATOR
ফিল্ড অ্যাক্সেস করতে পারেন।
class UserCreator {
static User fromParcel(Parcel parcel) {
return User.CREATOR.createFromParcel(parcel);
}
}
কোটলিনে, আপনি সরাসরি CREATOR
ক্ষেত্র ব্যবহার করতে পারবেন না। পরিবর্তে, kotlinx.parcelize.parcelableCreator
ব্যবহার করুন।
import kotlinx.parcelize.parcelableCreator
fun userFromParcel(parcel: Parcel): User {
return parcelableCreator<User>().createFromParcel(parcel)
}
সিরিয়ালাইজেশন থেকে বৈশিষ্ট্যগুলি এড়িয়ে যান
আপনি যদি কিছু সম্পত্তি পার্সেলাইজ করা থেকে এড়িয়ে যেতে চান, তাহলে @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 ব্যবহার করুন
আপনি সেই সম্পত্তির জন্য Parcel.writeValue
ব্যবহার করে Parcelize করতে @RawValue
দিয়ে একটি টাইপ টীকা করতে পারেন।
@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 সেটআপ করুন
Kotlin 2.0-এর আগে, আপনি expect
এবং actual
সাথে Parcelize টীকাগুলিকে উপনাম করে Parcelize ব্যবহার করতে পারেন:
// Common code
package example
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
expect annotation class MyParcelize()
expect interface MyParcelable
@Target(AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.SOURCE)
expect annotation class MyIgnoredOnParcel()
@MyParcelize
class MyClass(
val x: String,
@MyIgnoredOnParcel val y: String = ""
): MyParcelable
// Platform code
package example
actual typealias MyParcelize = kotlinx.parcelize.Parcelize
actual typealias MyParcelable = android.os.Parcelable
actual typealias MyIgnoredOnParcel = kotlinx.parcelize.IgnoredOnParcel
Kotlin 2.0 এবং উচ্চতর, প্লাগইনগুলিকে ট্রিগার করে এমন অ্যালিয়াসিং টীকা অসমর্থিত৷ এটি এড়াতে, প্লাগইনে additionalAnnotation
প্যারামিটার হিসাবে একটি নতুন Parcelize
টীকা প্রদান করুন।
// Gradle build configuration
kotlin {
androidTarget {
compilerOptions {
// ...
freeCompilerArgs.addAll("-P", "plugin:org.jetbrains.kotlin.parcelize:additionalAnnotation=example.MyParcelize")
}
}
}
// Common code
package example
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
// No `expect` keyword here
annotation class MyParcelize()
expect interface MyParcelable
@Target(AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.SOURCE)
expect annotation class MyIgnoredOnParcel()
@MyParcelize
class MyClass(
val x: String,
@MyIgnoredOnParcel val y: String = ""
): MyParcelable
// Platform code
package example
// No typealias for MyParcelize here
actual typealias MyParcelable = android.os.Parcelable
actual typealias MyIgnoredOnParcel = kotlinx.parcelize.IgnoredOnParcel
যেহেতু Parcel
ইন্টারফেস শুধুমাত্র অ্যান্ড্রয়েডে উপলব্ধ, পার্সেলাইজ অন্যান্য প্ল্যাটফর্মে কোনও কোড তৈরি করবে না, তাই সেখানে যে কোনও actual
বাস্তবায়ন খালি হতে পারে। Parcel
ক্লাসের উল্লেখ করার প্রয়োজন হয় এমন কোনো টীকা ব্যবহার করাও সম্ভব নয়, উদাহরণস্বরূপ @WriteWith
, সাধারণ কোডে।
প্রতিক্রিয়া
আপনি যদি kotlin-parcelize
Gradle প্লাগইন নিয়ে কোনো সমস্যার সম্মুখীন হন, আপনি একটি বাগ ফাইল করতে পারেন।
kotlin-parcelize
প্লাগইন একটি Parcelable
বাস্তবায়ন জেনারেটর প্রদান করে।
Parcelable
জন্য সমর্থন অন্তর্ভুক্ত করতে, আপনার অ্যাপের build.gradle
ফাইলে Gradle প্লাগইন যোগ করুন:
গ্রোভি
plugins { id 'kotlin-parcelize' }
কোটলিন
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
বিভিন্ন ধরনের সমর্থন করে:
- আদিম প্রকার (এবং তাদের বক্সযুক্ত সংস্করণ)
- বস্তু এবং enums
-
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
পার্সেল থেকে ডেটা তৈরি করুন
জাভা কোডে, আপনি সরাসরি CREATOR
ফিল্ড অ্যাক্সেস করতে পারেন।
class UserCreator {
static User fromParcel(Parcel parcel) {
return User.CREATOR.createFromParcel(parcel);
}
}
কোটলিনে, আপনি সরাসরি CREATOR
ক্ষেত্র ব্যবহার করতে পারবেন না। পরিবর্তে, kotlinx.parcelize.parcelableCreator
ব্যবহার করুন।
import kotlinx.parcelize.parcelableCreator
fun userFromParcel(parcel: Parcel): User {
return parcelableCreator<User>().createFromParcel(parcel)
}
সিরিয়ালাইজেশন থেকে বৈশিষ্ট্যগুলি এড়িয়ে যান
আপনি যদি কিছু সম্পত্তি পার্সেলাইজ করা থেকে এড়িয়ে যেতে চান, @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 ব্যবহার করুন
আপনি সেই সম্পত্তির জন্য Parcel.writeValue
ব্যবহার করে Parcelize করতে @RawValue
দিয়ে একটি টাইপ টীকা করতে পারেন।
@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 সেটআপ করুন
Kotlin 2.0-এর আগে, আপনি expect
এবং actual
সাথে Parcelize টীকাগুলিকে উপনাম করে Parcelize ব্যবহার করতে পারেন:
// Common code
package example
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
expect annotation class MyParcelize()
expect interface MyParcelable
@Target(AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.SOURCE)
expect annotation class MyIgnoredOnParcel()
@MyParcelize
class MyClass(
val x: String,
@MyIgnoredOnParcel val y: String = ""
): MyParcelable
// Platform code
package example
actual typealias MyParcelize = kotlinx.parcelize.Parcelize
actual typealias MyParcelable = android.os.Parcelable
actual typealias MyIgnoredOnParcel = kotlinx.parcelize.IgnoredOnParcel
Kotlin 2.0 এবং উচ্চতর, প্লাগইনগুলিকে ট্রিগার করে এমন অ্যালিয়াসিং টীকা অসমর্থিত৷ এটি এড়াতে, প্লাগইনে additionalAnnotation
প্যারামিটার হিসাবে একটি নতুন Parcelize
টীকা প্রদান করুন।
// Gradle build configuration
kotlin {
androidTarget {
compilerOptions {
// ...
freeCompilerArgs.addAll("-P", "plugin:org.jetbrains.kotlin.parcelize:additionalAnnotation=example.MyParcelize")
}
}
}
// Common code
package example
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
// No `expect` keyword here
annotation class MyParcelize()
expect interface MyParcelable
@Target(AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.SOURCE)
expect annotation class MyIgnoredOnParcel()
@MyParcelize
class MyClass(
val x: String,
@MyIgnoredOnParcel val y: String = ""
): MyParcelable
// Platform code
package example
// No typealias for MyParcelize here
actual typealias MyParcelable = android.os.Parcelable
actual typealias MyIgnoredOnParcel = kotlinx.parcelize.IgnoredOnParcel
যেহেতু Parcel
ইন্টারফেস শুধুমাত্র অ্যান্ড্রয়েডে উপলব্ধ, পার্সেলাইজ অন্যান্য প্ল্যাটফর্মে কোনও কোড তৈরি করবে না, তাই সেখানে যে কোনও actual
বাস্তবায়ন খালি হতে পারে। Parcel
ক্লাসের উল্লেখ করার প্রয়োজন হয় এমন কোনো টীকা ব্যবহার করাও সম্ভব নয়, উদাহরণস্বরূপ @WriteWith
, সাধারণ কোডে।
প্রতিক্রিয়া
আপনি যদি kotlin-parcelize
Gradle প্লাগইন নিয়ে কোনো সমস্যার সম্মুখীন হন, আপনি একটি বাগ ফাইল করতে পারেন।