Kotlin:继承和Parcelable数据问题

5

我正在努力理解一个问题,但是我没有找到特定的解决方案。

基类

open class FeedBase() : Parcelable{

var type : String =""

constructor(parcel: Parcel) : this() {
    type=parcel.readString()
}

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeString(type)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR: Parcelable.Creator<FeedBase> {
    override fun createFromParcel(parcel: Parcel): FeedBase {
        return FeedBase(parcel)
    }

    override fun newArray(size: Int): Array<FeedBase?> {
        return arrayOfNulls(size)
    }
}}

数据类的项目类,继承基类

@Parcelize
data class FeedItem(var feed:Feed) : FeedBase()

& Data类

@Parcelize
data class Feed(var test:String,var score:Int) : Parcelable

现在我正在尝试跨活动发送我的数据,我正在创建以下对象:
val feedItem = FeedItem(Feed("yolo", 1000))
feedItem.type="test"

但是我无法获得正确的 类型(基类中的变量)。当我从另一个活动中的可包含意图接收对象时,它会变为空白,但项目数据会被保留。我该如何解决这个问题?

1个回答

0

@Parcelize要求所有序列化属性在主构造函数中声明。

因此,它对type一无所知。在@Parcelize生成的代码中,基本上有

companion object CREATOR: Parcelable.Creator<FeedItem> {
    override fun createFromParcel(parcel: Parcel): FeedItem{
        val feed = Feed.CREATOR.createFromParcel(parcel)
        return FeedItem(feed)
    }
}

请注意,FeedBaseParcelable 实现并不重要。如果你仔细想想,它是无法使用的:如果你有一个

val feedBase = FeedBase.CREATOR.createFromParcel(parcel)

无法将此FeedBase实例转换为FeedItem实例。

您需要通过在伴生对象中实现Parceler来编写自定义逻辑以处理此情况。


是的,我已经阅读了那篇文章,但我的基类没有使用@Parcelize注释。因此,我编写了Parcelable creator。这样做是否有问题? - Gautam
你的基类使用什么并不重要,重要的是子类的构造函数中没有 type 参数。 - Alexey Romanov
我已经添加了一些内容来解释为什么 @Parcelize 没有使用 FeedBase 实现,希望这能有所帮助。 - Alexey Romanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接