Я пытаюсь понять проблему, но не могу найти никакого конкретного решения.
Базовый класс
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 в базовом классе). Он становится пустым всякий раз, когда я получаю объект из частичного намерения в другом действии, но данные элемента сохраняются. Как я могу это решить?
@Parcelizerequires 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 в сопутствующем объекте.
Неважно, что использует ваш базовый класс, важно то, что type не является параметром конструктора для подкласса.
Я добавил кое-что, чтобы объяснить, что реализация ЗачемFeedBase не используется @Parcelize, возможно, это поможет.
Да, я читал это, но мой базовый класс не использует аннотацию @Parcelize. Для этого я написал Parcelable Creator. Это неправильный подход?