首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Parcel.readTypedList()和@Parcel.readTypedList扩展?

如何使用Parcel.readTypedList()和@Parcel.readTypedList扩展?
EN

Stack Overflow用户
提问于 2018-08-11 11:48:14
回答 3查看 2.8K关注 0票数 10

在视图中实现基于Parcelable的状态持久性时遇到了问题。也就是说,我需要像这样实现BaseSavedState的方法:

代码语言:javascript
复制
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字段!

标有以下内容的类:

代码语言:javascript
复制
@Parcelize
data class MyParcelable(val someData: String): Parcelable {
}

没有创建者,事实上,如果你试图实现,它说:

“‘CREATOR”定义是不允许的。使用“Parceler”同伴对象代替。

我做不是想要一个Parceler伙伴对象,我需要一个创建者!

我也有点不想手工编写Parcelable实现,所以我可能只想让它成为可序列化的,并且类似于“任何东西”。

有没有人偶然知道如何将Parcel.readTypedList()@Parcelize-annotated Kotlin数据类一起使用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-22 07:21:38

https://github.com/JetBrains/kotlin/commit/fc013c6b9f5f3083d06385803ff687dc9a6ab4f0#

在Kotlin 1.6.21中,我们可以使用parcelableCreator()

代码语言:javascript
复制
import kotlinx.parcelize.parcelableCreator

val dataClass = TestDataClass("someValue")
val creator = parcelableCreator<TestDataClass>()
val parcel: Parcel? = null
parcel?.createTypedArrayList(creator) // Will compile
票数 5
EN

Stack Overflow用户

发布于 2018-08-23 08:18:12

它是Parcelize上的一个bug,就像您提到的https://youtrack.jetbrains.com/issue/KT-19853一样,它可以通过反射来解决,也可以通过反射来解决,也可以通过java的代理类来解决,因为您可以访问java中的CREATOR字段,而不会出现任何问题。

我为所有创建者创建了一个util java类,然后对该创建者进行了kotlin扩展。

Java

代码语言:javascript
复制
@NonNull
public static Parcelable.Creator<Blah> getBlahCreator() {
    return Blah.CREATOR;
}

Kotlin

代码语言:javascript
复制
val Blah.Companion.CREATOR: Parcelable.Creator<Blah>
 get() = UtilClass.getBlahCreator()

现在我可以在任何地方访问Blah.CREATOR!在可预见的将来,这两个拥有所有创建者和扩展的类可能会在bug修复后被删除,而且在其他使用CREATOR的类中,它将按预期工作而不进行任何编辑。

这对我来说比反射解决方案好得多!但是不管怎么说,它们都很恶心,我希望这个bug能很快被修复!

票数 12
EN

Stack Overflow用户

发布于 2020-08-17 07:51:58

当我在一个类中遇到相同的问题时,就对这个问题投了赞成票,但由于我是一个新用户,所以它是不可见的。我使用了下面的选项,(ReadArrayList),尽管它有很小的不同

代码语言:javascript
复制
readTypedList
arrayListOf<YourParcelableClass>().apply { parcel.readArrayList(YourParcelableClass::class.java.classLoader) }

谢谢您接受的解决方案,但不知道为什么,即使在java类文件中,我也无法读取CREATOR字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51799353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档