Класс X не является абстрактным и не реализует забавную функцию writeToParcel (), определенную в android.os.Parcelable.

В моем приложении для Android я хочу добавить Bundle, включающий объект 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): Unit, определенный в android.os.Parcelable

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

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

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

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

androidExtensions {
    experimental = true
}

в производственном персонале.

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


person Noam Silverstein    schedule 07.05.2019    source источник
comment
Почему вы не хотите использовать экспериментальное = true? Это обязательное условие для работы!   -  person theblitz    schedule 07.05.2019
comment
Большинство компаний не разрешают использовать экспериментальные функции в своих приложениях. JetBrains должна вывести это из экспериментального состояния и работать без   -  person Noam Silverstein    schedule 07.05.2019
comment
Проверьте мой обновленный ответ! : D   -  person Some random IT boy    schedule 19.06.2019


Ответы (3)


ОБНОВЛЕНИЕ 19/11/2019

После стабильного выпуска Kotlin 1.3.60 и соответствующий плагин для Android Studio больше не проблема. Давайте праздновать

ОБНОВЛЕНИЕ 27/08/2019

После небольшого количества исследований и тестирования с новым Kotlin 1.3.50 кажется, что проблема будет окончательно решена, когда они выпустят Kotlin 1.3.60 в соответствии с этой проблемой YouTrack

РЕДАКТИРОВАТЬ 19.06.2019

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

Пример кода

Пример кода

Пример кода

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

введите описание изображения здесь

Старый ответ

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

Джейк Уортон в посылке

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


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

person Some random IT boy    schedule 14.05.2019
comment
(После обновления 19/11/2019) - Проблема сохраняется в плагине 3.5.2 AS + и 1.3.60 kotlin - person Breadbin; 19.11.2019
comment
Для меня это работает; Версия плагина Kotlin для Android Studio 3.5.2: 1.3.60-release-Studio3.5.1 (стабильный канал обновления) Android Studio 3.5.2 Build # AI-191.8026.42.35.5977832, построено 30 октября 2019 г. JRE: 1.8.0_202- release-1483-b49-5587405 x86_64 JVM: 64-разрядная серверная виртуальная машина OpenJDK от JetBrains sro macOS 10.14.6 - person Some random IT boy; 21.11.2019
comment
Сделал все как обычно, чтобы исключить кеширование. Вернулся к нему после обеда, и все было хорошо. Время лечит все раны, кажется - person Breadbin; 29.11.2019
comment
Проблема сохраняется и у меня в Android Studio версии 4.1.3 и Kotlin версии 1.4.32. - person Namrata Bagerwal; 30.03.2021

В моем сценарии я уже использую версию плагина 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

проверьте последнюю версию и установите, оставив две версии одинаковыми.

введите здесь описание изображения

person Jeffery Ma    schedule 16.02.2020
comment
Чтобы удалить предупреждение об ошибке из Android Studio, у меня это сработало. Пользуюсь версией 1.3.60. - person Rafael Pereira Ramos; 28.02.2020
comment
Это помогает, хотя в моем случае в моем файле Gradle была указана старая версия Kotlin ›_‹ - person Matt Mc; 11.05.2020

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

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

person r2rek    schedule 14.05.2019