Parcelize жалуется "Parcelable должен быть классом" на объекты и перечисления

Когда я пытаюсь комментировать enum class или же object с @Parcelize, это приводит к ошибке 'Parcelable' should be a class, как подсказка редактора и как ошибка компиляции. Я могу @Parcelize классы просто отлично, но я не могу делать такие вещи, как

@Parcelize object MySingletion : Parcelable
@Parcelize enum class Direction : Parcelable { N, E, W, S }

Это происходит, даже несмотря на то, что на веб-сайте Kotlin явно указываются объекты и перечисления. Есть ли способ исправить это, чтобы я мог @Parcelize эти типы классов? И в идеале, есть ли решение, которое не предполагает ручного кодирования логики парсера?

2 ответа

Решение

Документированная поддержка означает, что объекты и перечисления должным образом обрабатываются при использовании в качестве свойств для класса, подлежащего сортировке. Что более важно, оба типа неявно исключаются из использования, так как поля должны быть свойствами, определенными в основном конструкторе:

@Parcelize требует, чтобы все сериализованные свойства были объявлены в основном конструкторе. Расширения Android будут выдавать предупреждение о каждом свойстве с полем поддержки, объявленным в теле класса. Также, @Parcelize не может быть применено, если некоторые из параметров основного конструктора не являются свойствами.

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

Начиная с Kotlin 1.2.60, CHANGELOG утверждает, что Parcelize работает с объектами и типами enum.

Другие вопросы по тегам