Kotlin:可打包数据的继承和问题

时间:2018-12-08 10:59:17

标签: android inheritance kotlin parcelable

我正在努力解决一个问题,但找不到任何特定的解决方案。

基类

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)
    }
}}

包含数据类和扩展基类的Item类

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

&数据类

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

现在,我正在尝试跨活动发送数据,并且正在创建对象,如下所示

val feedItem = FeedItem(Feed("yolo", 1000))
feedItem.type="test"

但是我无法获得正确的类型(基本类中的var)。每当我在另一个活动中从可拆分意图接收到对象时,它就会变空,但会保留Item数据。我该如何解决?

1 个答案:

答案 0 :(得分:0)

  

@Parcelize requires all serialized properties to be declared in the primary constructor.

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

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

请注意,FeedBase的{​​{1}}实现并不重要。如果您考虑过,它就不能使用:如果您有

Parcelable

无法将这个val feedBase = FeedBase.CREATOR.createFromParcel(parcel) 实例转换为FeedBase实例。

在这种情况下,您需要通过在伴随对象中实现FeedItem来编写自定义逻辑。