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

标签 android kotlin parcelable kotlin-android-extensions

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

相关文章:

java - Android工具栏后退按钮错误

java - Android 在 onCreate() 之外使用 javascript/java 桥设置软输入模式

android - WebView 无法加载某些网页

android - 如何解决错误消息 : "Inheritance from an interface with ' @JvmDefault' members is only allowed with -Xjvm-default option"

database - 我如何在 Android 中查询 SQLite 数据库?

Android:两个 EditText 不能有两个 addTextChangedListener?

Kotlin 可空变量赋值

java - 使用 Intent 在 Activity 之间传递自定义对象

android - 如何在android中使用Intent将对象的ArrayList从一个 Activity 传递到另一个 Activity ?

android - 在 Parcelable 中存储复杂的对象图?