gpt4 book ai didi

android - 如何将 Parcel.readTypedList() 与 kotlin-android-extensions 中的 @Parcelize 一起使用?

转载 作者:太空狗 更新时间:2023-10-29 16:26:16 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com