Actualmente estoy usando el excelente AutoParcel en mi proyecto Java, lo que facilita la creación de clases Parcelable.
Ahora, Kotlin, que considero para mi próximo proyecto, tiene este concepto de clases de datos, que generan automáticamente los métodos equals, hashCode y toString.
¿Existe una forma conveniente de hacer que una clase de datos de Kotlin sea Parcelable de una manera conveniente (sin implementar los métodos manualmente)?
android
parcelable
kotlin
thalesmello
fuente
fuente
Respuestas:
Kotlin 1.1.4 está fuera
El complemento de extensiones de Android ahora incluye un generador de implementación Parcelable automático. Declare las propiedades serializadas en un constructor primario y agregue una anotación @Parcelize, y los métodos writeToParcel () / createFromParcel () se crearán automáticamente:
Por lo tanto, debe habilitarlos agregando esto a su módulo build.gradle :
fuente
this calss implements Parcelable but does not provice CREATOR field
. ¿Es tu respuesta suficiente (completa)?@SuppressLint("ParcelCreator")
para deshacerse de la advertencia de pelusa.Puedes probar este complemento:
android-parcelable-intellij-plugin-kotlin
Le ayuda a generar código repetitivo de Android Parcelable para la clase de datos de kotlin. Y finalmente se ve así:
fuente
Simplemente haga clic en la palabra clave de datos de su clase de datos kotlin, luego presione alt + Enter, seleccione la primera opción que dice
"Add Parceable Implementation"
fuente
parcel.read...
porTODO
, si un campo no lo esval/var
. Si lo usaList
dentro de una clase, su implementación se convierte en un problema. Así que recurrí a@Parcelize
la respuesta aceptada.¿Ha probado PaperParcel ? Es un procesador de anotaciones que genera automáticamente el
Parcelable
código repetitivo de Android .Uso:
Anote su clase de datos con
@PaperParcel
, implementePaperParcelable
y agregue una instancia estática de JVM del generado,CREATOR
por ejemplo:Ahora su clase de datos es
Parcelable
y se puede pasar directamente a unBundle
oIntent
Editar: actualizar con la última API
fuente
La mejor manera sin ningún código repetitivo es el complemento Smuggler gradle. Todo lo que necesita es implementar la interfaz AutoParcelable como
Y eso es todo. También funciona para clases selladas. Además, este complemento proporciona validación en tiempo de compilación para todas las clases AutoParcelable.
UPD 17.08.2017 Ahora, con Kotlin 1.1.4 y el complemento de extensiones de Android Kotlin , puede usar la
@Parcelize
anotación. En este caso, el ejemplo anterior se verá así:No es necesario ningún
data
modificador. La mayor desventaja, por ahora, es usar el complemento kotlin-android-extensions que tiene muchas otras funciones que podrían ser innecesarias.fuente
Usando Android Studio y el complemento Kotlin , encontré una manera fácil de convertir mi antiguo Java
Parcelable
s sin complementos adicionales (si todo lo que desea es convertir una nuevadata
clase en unParcelable
, pase a la cuarta fragmento de código).Digamos que tienes una
Person
clase con toda laParcelable
placa de la caldera:Comience eliminando la
Parcelable
implementación, dejando un objeto Java antiguo, simple y simple (las propiedades deben ser definitivas y las debe establecer el constructor):Entonces deja que la
Code > Convert Java file to Kotlin File
opción haga su magia:Convierta esto en una
data
clase:Y finalmente, convierta esto en un
Parcelable
nuevo. Coloca el cursor sobre el nombre de la clase y Android Studio debería darte la opciónAdd Parcelable Implementation
. El resultado debería verse así:Como puede ver, la
Parcelable
implementación es un código generado automáticamente que se adjunta adata
la definición de su clase.Notas:
Parcelable
directamente en Kotlin no producirá el mismo resultado con la versión actual del complemento Kotlin (1.1.3
).Parcelable
introduce el generador de código actual . Debe ser un error menor.Espero que este consejo te funcione tan bien como a mí.
fuente
Dejaré mi forma de hacer por si pudiera ayudar a alguien.
Lo que hago es tener un genérico
Parcelable
Y luego creo parcelables como este:
Lo que me deshace de esa anulación estándar.
fuente
Ejemplo:
fuente
Desafortunadamente, no hay forma en Kotlin de poner un campo real en una interfaz, por lo que no puede heredarlo de un adaptador de interfaz de forma gratuita:
data class Par : MyParcelable
Puede mirar la delegación, pero no ayuda con los campos, AFAIK: https://kotlinlang.org/docs/reference/delegation.html
Entonces, la única opción que veo es una función de tejido
Parcelable.Creator
, lo cual es algo obvio.fuente
prefiero usar la https://github.com/johncarl81/parceler lib con
fuente
Puedes hacerlo usando
@Parcelize
anotación. Es un generador automático de implementación Parcelable.Primero, debe habilitarlos agregando esto al build.gradle de su módulo:
Declare las propiedades serializadas en un constructor primario y agregue una
@Parcelize
anotación, y los métodoswriteToParcel()
/createFromParcel()
se crearán automáticamente:Usted NO es necesario añadir
experimental = true
en el interiorandroidExtensions
del bloque.fuente
Kotlin ha hecho que todo el proceso de paquetería en Android sea muy fácil con su anotación @Parcel.
Para hacer eso
Paso 1. Agregue extensiones de Kotlin en su módulo de aplicación gradle
Paso 2. Agregue experimental = true ya que esta función aún se encuentra en experimentación en gradle.
Paso 3. Anone la clase de datos con @Parcel
Aquí hay un ejemplo simple sobre el uso de @Parcel
fuente
Hay un complemento, pero no siempre está tan actualizado como Kotlin está evolucionando: https://plugins.jetbrains.com/plugin/8086
Alternativa: tengo un ejemplo funcional de una clase de datos personalizados usando
Parcelable
y listas:Clases de datos que usan Parcelable con listas:
¡Espero eso ayude!
fuente