我在 View 中实现基于 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' definition is not allowed. Use 'Parceler' companion object instead.
我不想要一个Parceler伴生对象,我需要一个CREATOR!
我也有点不想手动编写 Parcelable 实现,所以我可能只是让它可序列化,就像“随便”一样。
有没有人偶然知道如何将 Parcel.readTypedList()
与 @Parcelize
注释的 Kotlin 数据类一起使用?
最佳答案
这是您提到的 Parcelize 插件上的错误 https://youtrack.jetbrains.com/issue/KT-19853它可以通过反射来解决,或者实际上,您可以有一个 java 的代理类,因为您可以毫无问题地访问 java 中的 CREATOR
字段。
我为所有创作者制作了一个 util java 类,然后制作了一个引用该创作者的 kotlin 扩展
Java
@NonNull
public static Parcelable.Creator<Blah> getBlahCreator() {
return Blah.CREATOR;
}
Kotlin
val Blah.Companion.CREATOR: Parcelable.Creator<Blah>
get() = UtilClass.getBlahCreator()
现在我可以在任何地方访问 Blah.CREATOR
!在可预见的 future ,错误得到修复后,这两个具有所有创建者和扩展的类可能会被删除,并且它会按预期工作,而无需对使用 CREATOR
的其他类进行任何编辑>
这个我感觉比反射方案好多了!但不管怎样,它们都很恶心,我希望这个错误能尽快修复!
关于android - 如何将 Parcel.readTypedList() 与 kotlin-android-extensions 中的 @Parcelize 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51799353/