Класс X не абстрактный и не реализует забавную writeToParcel (), определенную в android.os.Parcelable - PullRequest
3 голосов
/ 07 мая 2019

В моем приложении для Android я хочу добавить комплект, включающий в себя объект Place, описанный ниже, в мое намерение. Поскольку сериализация была медленной и не рекомендуется, я предпочел Parcelable.

Несмотря на то, что я использую Kotlin 1.3.31, у меня проблемы с разбивкой некоторых классов данных. Пример:

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Place(val street: String, val postal: String, val city: String) : Parcelable

и Android Studio жалуется:

Класс 'Place' не является абстрактным и не реализует абстрактный член public abstract fun writeToParcel (p0: Parcel !, p1: Int): определена единица в android.os.Parcelable

Согласно некоторым учебникам

Вот и все! Вам больше не нужно писать какие-либо методы обработки посылок!

https://android.jlelse.eu/yet-another-awesome-kotlin-feature-parcelize-5439718ba220

и я не хочу использовать

androidExtensions {
    experimental = true
}

в производстве.

Какие альтернативы у меня здесь есть?

Ответы [ 2 ]

4 голосов
/ 14 мая 2019

РЕДАКТИРОВАТЬ 19/06/2019

С выпуском Kotlin 1.3.40 аннотация @Parcelize не является экспериментальной и работает довольно хорошо. Единственная проблема - сообщенная проблема , из-за которой среда IDE становится красной, оставляя ее на той стороне, в которой код компилируется и работает идеально.

Sample code

Sample code

Sample code

Я также тестировал с такими объектами, и он также работает:

enter image description here

Старый ответ

Я столкнулся с точно такой же проблемой, и во время расследования я нашел это:

Jake Wharton on parcelize

Таким образом, похоже, что аннотация @Parcelize будет полностью стабильной, начиная с Kotlin 1.3.40. До этого вам нужно будет установить флаг experimental. (К сожалению)


Они ошибочно выдвинули @Parcelize за пределы экспериментальных функций, и вы по-прежнему получаете эту ошибку компиляции.

0 голосов
/ 14 мая 2019

Вы всегда можете просто реализовать Parcelable (cmd + enter / alt + enter по имени класса -> `Добавить Parcelable реализации", чтобы IDE могла создать схемы методов для вас), если вы не хотите / не можете использовать экспериментальный расширения.

Тем не менее, я использую @Parcelize в среде prod (после длительного тестирования) более года, без проблем. (Просто мнение, не говоря, что вы должны это делать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...