代码之家  ›  专栏  ›  技术社区  ›  EpicPandaForce

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

  •  2
  • EpicPandaForce  · 技术社区  · 6 年前

    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() 因为它需要输入列表和包裹 CREATOR

    类标记为:

    @Parcelize
    data class MyParcelable(val someData: String): Parcelable {
    }
    

    不允许“创建者”定义。改用“Parceler”伴生对象。

    我愿意

    我也不想手工编写可打包的实现,所以我可能会使它序列化,就像“随便什么”。


    包。readTypedList() 具有 @Parcelize -注释的Kotlin数据类?

    1 回复  |  直到 5 年前
        1
  •  6
  •   Ahmed Hegazy    6 年前

    这是你提到的Parcelize插件上的一个bug https://youtrack.jetbrains.com/issue/KT-19853 CREATOR java中的字段没有任何问题。

    爪哇

    爪哇

    @NonNull
    public static Parcelable.Creator<Blah> getBlahCreator() {
        return Blah.CREATOR;
    }
    

    val Blah.Companion.CREATOR: Parcelable.Creator<Blah>
     get() = UtilClass.getBlahCreator()
    

    现在我可以进入 Blah.CREATOR 造物主

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