В настоящее время я использую превосходный AutoParcel в своем проекте Java, который облегчает создание классов Parcelable.
Теперь в Kotlin, который я рассматриваю для своего следующего проекта, есть концепция классов данных, которые автоматически генерируют методы equals, hashCode и toString.
Есть ли удобный способ сделать класс данных Kotlin Parcelable удобным способом (без реализации методов вручную)?
android
parcelable
kotlin
талесмелло
источник
источник
Ответы:
Kotlin 1.1.4 отсутствует
Плагин Android Extensions теперь включает автоматический генератор реализации Parcelable. Объявите сериализованные свойства в основном конструкторе и добавьте аннотацию @Parcelize, и методы writeToParcel () / createFromParcel () будут созданы автоматически:
Поэтому вам нужно включить их, добавив это в ваш модуль build.gradle :
источник
this calss implements Parcelable but does not provice CREATOR field
. Ваш ответ достаточно (полный)?@SuppressLint("ParcelCreator")
чтобы избавиться от предупреждения о ворсинах.Вы можете попробовать этот плагин:
Android-Parcelable-Intellij-плагин-Котлин
Он поможет вам сгенерировать шаблонный код Android Parcelable для класса данных kotlin. И в итоге это выглядит так:
источник
Просто щелкните ключевое слово data вашего класса данных kotlin, затем нажмите alt + Enter, выберите первый вариант, говорящий
"Add Parceable Implementation"
источник
parcel.read...
наTODO
, если поля нетval/var
. Если вы используетеList
внутри класса, ваша реализация становится проблемой. Итак, я обратился к@Parcelize
принятому ответу.Вы пробовали PaperParcel ? Это процессор аннотаций, который автоматически генерирует
Parcelable
для вас шаблонный код Android .Использование:
Аннотируйте свой класс данных
@PaperParcel
, реализуйтеPaperParcelable
и добавьте статический экземпляр JVM сгенерированного,CREATOR
например:Теперь ваш класс данных есть
Parcelable
и может быть передан напрямую вBundle
илиIntent
Изменить: обновление с последним API
источник
Лучший способ с не шаблонного кода на все Контрабандист Gradle плагин. Все, что вам нужно, это просто реализовать интерфейс AutoParcelable, например
И это все. Также работает для закрытых классов. Также этот плагин обеспечивает проверку времени компиляции для всех классов AutoParcelable.
UPD 17.08.2017 Теперь с плагином расширений Kotlin 1.1.4 и Kotlin для Android можно было использовать
@Parcelize
аннотации. В этом случае приведенный выше пример будет выглядеть так:В
data
модификаторе нет необходимости . Самым большим недостатком на данный момент является использование плагина kotlin-android-extensions, который имеет множество других функций, которые могут быть ненужными.источник
Использование Android Studio и Котлин плагин, я нашел простой способ конвертировать мой старый Java
Parcelable
s с каких - либо дополнительных плагинов (если все , что вы хотите, чтобы превратить новыйdata
класс вParcelable
, переходите к 4 - й фрагмент кода).Допустим, у вас есть
Person
класс со всемиParcelable
котлами:Начните с удаления
Parcelable
реализации, оставив простой, простой, старый объект Java (свойства должны быть окончательными и устанавливаться конструктором):Тогда позвольте этой
Code > Convert Java file to Kotlin File
опции творить чудеса:Преобразуйте это в
data
класс:И, наконец, давайте снова превратим это в
Parcelable
. Наведите указатель мыши на имя класса, и Android Studio должна предоставить вам возможностьAdd Parcelable Implementation
. Результат должен выглядеть так:Как видите,
Parcelable
реализация - это некий автоматически сгенерированный код, добавленный кdata
определению вашего класса.Ноты:
Parcelable
непосредственно в Kotlin не даст такого же результата с текущей версией плагина Kotlin (1.1.3
).Parcelable
вводит текущий генератор кода. Должна быть небольшая ошибка.Я надеюсь, что этот совет сработает для вас так же хорошо, как и для меня.
источник
Пример :
источник
Я оставлю свой способ работы на случай, если это кому-то поможет.
Что я делаю, так это то, что у меня есть общий
Parcelable
А затем я создаю такие посылки:
Это избавляет меня от этого шаблонного переопределения.
источник
К сожалению, в Kotlin нет возможности разместить реальное поле в интерфейсе, поэтому вы не можете наследовать его от интерфейсного адаптера бесплатно:
data class Par : MyParcelable
Вы можете посмотреть на делегирование, но это не помогает с полями, AFAIK: https://kotlinlang.org/docs/reference/delegation.html
Итак, единственный вариант, который я вижу, - это функция ткани
Parcelable.Creator
, что отчасти очевидно.источник
я предпочитаю просто использовать https://github.com/johncarl81/parceler lib с
источник
Вы можете сделать это с помощью
@Parcelize
аннотации. Это автоматический генератор реализации Parcelable.Во-первых, вам нужно разрешить им добавить это в build.gradle вашего модуля:
Объявите сериализованные свойства в основном конструкторе и добавьте
@Parcelize
аннотацию, иwriteToParcel()
/createFromParcel()
методы будут созданы автоматически:Вам НЕ нужно добавлять
experimental = true
внутреннийandroidExtensions
блок.источник
Kotlin упростил весь процесс Parcelization в Android с помощью аннотации @Parcel.
Сделать это
Шаг 1. Добавьте расширения Kotlin в модуль вашего приложения gradle
Шаг 2. Добавьте экспериментальное = true, так как эта функция все еще находится в стадии экспериментов в градиенте.
Шаг 3. Анонсируйте класс данных с помощью @Parcel
Вот простой пример использования @Parcel
источник
Существует плагин, но он не всегда обновляется по мере развития Kotlin: https://plugins.jetbrains.com/plugin/8086
Альтернатива: у меня есть рабочий пример настраиваемого класса данных с использованием
Parcelable
списков и:Классы данных, использующие Parcelable со списками:
Надеюсь, поможет!
источник