Trình bổ trợ kotlin-parcelize
cung cấp trình tạo triển khai Parcelable
.
Để hỗ trợ Parcelable
, hãy thêm trình bổ trợ Gradle vào tệp build.gradle
của ứng dụng:
Groovy
plugins { id 'kotlin-parcelize' }
Kotlin
plugins { id("kotlin-parcelize") }
Khi bạn chú thích một lớp (class) bằng @Parcelize
, phương thức triển khai Parcelable
sẽ tự động được tạo, như trong ví dụ sau:
import kotlinx.parcelize.Parcelize
@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable
@Parcelize
đòi hỏi khai báo tất cả thuộc tính tuần tự trong hàm khởi tạo chính. Trình bổ trợ này cảnh báo về từng thuộc tính có một trường sao lưu được khai báo trong nội dung lớp. Ngoài ra, bạn không thể áp dụng @Parcelize
nếu một số tham số của hàm khởi tạo chính không phải là thuộc tính.
Nếu lớp của bạn yêu cầu logic tuần tự hoá nâng cao hơn, hãy ghi lớp này vào trong lớp đồng hành (companion class):
@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
}
}
}
Các kiểu được hỗ trợ
@Parcelize
hỗ trợ nhiều kiểu:
- Kiểu nguyên bản (và các phiên bản đóng hộp)
- Đối tượng và enum
String
,CharSequence
Exception
Size
,SizeF
,Bundle
,IBinder
,IInterface
,FileDescriptor
SparseArray
,SparseIntArray
,SparseLongArray
,SparseBooleanArray
- Tất cả cách triển khai
Serializable
(bao gồm cảDate
) vàParcelable
- Bộ sưu tập toàn bộ kiểu được hỗ trợ:
List
(được ánh xạ tớiArrayList
),Set
(được ánh xạ tớiLinkedHashSet
),Map
(được ánh xạ tớiLinkedHashMap
)- Ngoài ra, có một số cách triển khai cụ thể:
ArrayList
,LinkedList
,SortedSet
,NavigableSet
,HashSet
,LinkedHashSet
,TreeSet
,SortedMap
,NavigableMap
,HashMap
,LinkedHashMap
,TreeMap
,ConcurrentHashMap
- Ngoài ra, có một số cách triển khai cụ thể:
- Mảng (array) thuộc mọi kiểu được hỗ trợ
- Phiên bản có tính chất rỗng của mọi kiểu được hỗ trợ
Parceler
tuỳ chỉnh
Nếu kiểu của bạn không được hỗ trợ trực tiếp, bạn có thể viết một đối tượng ánh xạ Parceler
cho kiểu đó.
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)
}
}
Bạn có thể áp dụng các trình đóng gói (parceler) bên ngoài bằng chú thích @TypeParceler
hoặc @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
Ý kiến phản hồi
Nếu gặp vấn đề với trình bổ trợ kotlin-parcelize
cho Gradle, bạn có thể báo cáo lỗi.