【发布时间】:2018-08-11 11:48:14
【问题描述】:
我在视图中实现基于 Parcelable 的状态持久性时遇到了问题。即,因为我需要像这样实现BaseSavedState 的方法:
class SavedState : BaseSavedState {
lateinit var myList: ArrayList<MyParcelable>
constructor(superState: Parcelable) : super(superState) {}
private constructor(parcel: Parcel) : super(parcel) {
val listSize = parcel.readInt()
val list = ArrayList<MyParcelable>(listSize)
this.myList = parcel.readTypedList(list, /* needs MyParcelable.CREATOR */ )
}
override fun writeToParcel(out: Parcel, flags: Int) {
super.writeToParcel(out, flags)
out.writeInt(myList.size())
out.writeTypedList(myList)
}
companion object {
@JvmField
val CREATOR: Parcelable.Creator<SavedState> = object : Parcelable.Creator<SavedState> {
override fun createFromParcel(`in`: Parcel): SavedState {
return SavedState(`in`)
}
override fun newArray(size: Int): Array<SavedState?> {
return arrayOfNulls(size)
}
}
}
}
但是,如您所见,我似乎无法使用 Parcel.readTypedList(),因为它需要类型列表和 parcelable 的 CREATOR 字段!
类标记为:
@Parcelize
data class MyParcelable(val someData: String): Parcelable {
}
没有CREATOR,其实如果你尝试实现,它会说:
'CREATOR' 定义是不允许的。请改用“Parceler”伴随对象。
我确实不想要 Parceler 伴侣对象,我需要一个 CREATOR!
我也有点不想手动编写 Parcelable 实现,所以我可能只是将它设为 Serializable 并像“随便”一样。
有没有人偶然知道如何将Parcel.readTypedList() 与@Parcelize-annotated Kotlin 数据类一起使用?
【问题讨论】:
-
显然这是 youtrack.jetbrains.com/issue/KT-19853 中报告的错误,可以通过使用反射获取生成的 CREATOR 来解决。显然,它在一年前就为人所知,但似乎没有人真正关心它。好吧,
Serializable是在此期间。 -
我也许可以做你在打包 RealmList 时需要做的事情:stackoverflow.com/questions/49455684/…
标签: android kotlin parcelable kotlin-android-extensions