Класс X не абстрактный и не реализует забавную writeToParcel(), определенную в android.os.Parcelable
В моем приложении для 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 ответа
Я столкнулся с точно такой же проблемой, и во время расследования я обнаружил это:
Так выглядит @Parcelize
аннотация будет полностью стабильной, начиная с Kotlin 1.3.40
, До тех пор вы должны будете установить experimental
флаг. (К сожалению)
Они неправильно толкнули @Parcelize
за пределами экспериментальных функций, и вы все еще получаете эту ошибку компиляции.
В моем сценарии я уже использовал версию плагина Kotlin последней, чем 1.3.40
версия.
Но у меня все еще есть ошибка Android Studio, успешная компиляция, но IDE жалуется на@Parcelize
аннотация.
Может быть, ты тоже это понял.
Вот решение.
Убедитесь, что версия вашего плагина kotlin, которую вы настроили в Gradle, является той же версией, что и в Android Studio.
Я получил ошибку, потому что моя версия плагина Gradle koltin 1.3.61
а встроенная версия Android Studio - 1.3.50
Как обновить версию плагина Kotlin?
Инструменты -> Kotlin -> Настроить обновление плагина kotlin
проверьте последнюю версию и установите, оставив две версии одинаковыми.
Вы всегда можете просто реализовать Parcelable(cmd+enter/alt+enter для имени класса -> `Add Parcelable Реализация ', чтобы IDE могла создать схемы методов для вас), если вы не хотите / не можете использовать экспериментальные расширения.
Тем не менее, я использую @Parcelize в среде prod (хотя после большого тестирования) уже более года, без каких-либо проблем.