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 usaListdentro de una clase, su implementación se convierte en un problema. Así que recurrí a@Parcelizela respuesta aceptada.¿Ha probado PaperParcel ? Es un procesador de anotaciones que genera automáticamente el
Parcelablecódigo repetitivo de Android .Uso:
Anote su clase de datos con
@PaperParcel, implementePaperParcelabley agregue una instancia estática de JVM del generado,CREATORpor ejemplo:Ahora su clase de datos es
Parcelabley se puede pasar directamente a unBundleoIntentEditar: 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
@Parcelizeanotación. En este caso, el ejemplo anterior se verá así:No es necesario ningún
datamodificador. 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
Parcelables sin complementos adicionales (si todo lo que desea es convertir una nuevadataclase en unParcelable, pase a la cuarta fragmento de código).Digamos que tienes una
Personclase con toda laParcelableplaca de la caldera:Comience eliminando la
Parcelableimplementació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 Fileopción haga su magia:Convierta esto en una
dataclase:Y finalmente, convierta esto en un
Parcelablenuevo. 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
Parcelableimplementación es un código generado automáticamente que se adjunta adatala definición de su clase.Notas:
Parcelabledirectamente en Kotlin no producirá el mismo resultado con la versión actual del complemento Kotlin (1.1.3).Parcelableintroduce 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
ParcelableY 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 : MyParcelablePuede 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
@Parcelizeanotació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
@Parcelizeanotación, y los métodoswriteToParcel()/createFromParcel()se crearán automáticamente:Usted NO es necesario añadir
experimental = trueen el interiorandroidExtensionsdel 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
Parcelabley listas:Clases de datos que usan Parcelable con listas:
¡Espero eso ayude!
fuente