Котлин: наследование и проблема с данными посылки

Я пытаюсь понять проблему, но не могу найти никакого конкретного решения.

Базовый класс

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

& Класс данных

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

Теперь я пытаюсь отправить свои данные по действиям, и я создаю свой объект, как показано ниже.

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

но я не могу получить правильный тип (var в базовом классе). Он становится пустым всякий раз, когда я получаю объект из частичного намерения в другом действии, но данные элемента сохраняются. Как я могу это решить?

4
0
1 850
1

Ответы 1

@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 в Parcelable не имеет значения. Если задуматься, можно использовать не мог: если бы у вас

val feedBase = FeedBase.CREATOR.createFromParcel(parcel)

нет возможности превратить этот экземпляр FeedBase в экземпляр FeedItem.

Вам нужно будет написать собственную логику для этого случая, реализовав Parceler в сопутствующем объекте.

Да, я читал это, но мой базовый класс не использует аннотацию @Parcelize. Для этого я написал Parcelable Creator. Это неправильный подход?

Gautam 08.12.2018 13:56

Неважно, что использует ваш базовый класс, важно то, что type не является параметром конструктора для подкласса.

Alexey Romanov 08.12.2018 15:11

Я добавил кое-что, чтобы объяснить, что реализация ЗачемFeedBase не используется @Parcelize, возможно, это поможет.

Alexey Romanov 08.12.2018 15:24

Другие вопросы по теме