Класс 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 (хотя после большого тестирования) уже более года, без каких-либо проблем.