Kotlin: наследование и проблема с передаваемыми данными - PullRequest
0 голосов
/ 08 декабря 2018

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

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

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 в базовом классе).Он становится пустым всякий раз, когда я получаю объект от намеренного предложения в другом действии, но данные элемента сохраняются.Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 08 декабря 2018

@Parcelize требует, чтобы все сериализованные свойства были объявлены в первичном конструкторе.

Так что он не имеет представления о 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 в объекте-компаньоне.

...