parcelable - kotlinx - parcelize kotlin
Uso de Parceler con la clase de datos Kotlin con el constructor para la serialización (3)
¿Hay una manera de usar Parceler con clases de datos Kotlin y constructor para la serialización sin usar la anotación @ParcelProperty
para cada campo?
Si intento y uso la biblioteca como esta:
@Parcel
data class Valve @ParcelConstructor constructor(val size: Int)
Me sale Error:Parceler: No corresponding property found for constructor parameter arg0
. Pero si agrego @ParcelProperty("size")
funciona bien.
¿Porqué es eso?
Actualización :
Hay otra forma de usar esta biblioteca.
Podría simplemente eliminar la anotación @ParcelConstructor
, pero luego obtendré un error
Error:Parceler: No @ParcelConstructor annotated constructor and no default empty bean constructor found.
Creo que (no lo he probado) también podría hacer que todos los parámetros del constructor sean opcionales y agregar @JvmOverloads
pero eso tiene el efecto secundario de que tengo que verificar todas las propiedades de la clase si son nulas o no.
Actualización 2 :
Esto es lo que funcionó para mí:
@Parcel
data class Valve(val size: Int? = null)
En resumen, la clase Java generada debe tener un constructor vacío predeterminado. Una forma de lograrlo es hacer lo mismo que antes: todas las variables deben tener valores predeterminados.
Sé que esta pregunta ya tiene una respuesta, pero para futuros espectadores que también están luchando para que Parceler trabaje con objetos de datos kotlin, escribí un nuevo procesador de anotaciones para generar la placa de referencia Parcelable para las clases de datos Kotlin. Está diseñado para reducir de forma masiva el código de referencia al hacer que sus clases de datos sean parcelables:
https://github.com/grandstaish/paperparcel
Uso:
Anote su clase de datos con @PaperParcel
, implemente PaperParcelable
, y agregue una instancia estática JVM del PaperParcelable
generado, por ejemplo:
@PaperParcel
data class Example(
val test: Int,
...
) : PaperParcelable {
companion object {
@JvmField val CREATOR = PaperParcelExample.CREATOR
}
}
Ahora su clase de datos es Parcelable
y se puede pasar directamente a un Bundle
o Intent
Editar: Actualizar con la última API
Según los documentos, Parceler por defecto trabaja con campos públicos. Pero una data class
Kotlin habitual (como en su ejemplo) es más bien un "bean getter / setter tradicional", ya que cada propiedad Kotlin está representada por un campo privado y un getter / [setter].
TL; DR: Creo que esto funcionará:
@Parcel(Serialization.BEAN)
data class Valve(val size: Int = 10)
Tenga en cuenta el valor predeterminado, le permite a Kotlin generar automáticamente un constructor vacío adicional, que es requerido por la especificación de Java Been.
Otra forma sería marcar el constructor que ya tenemos:
@Parcel(Serialization.BEAN)
data class Driver @ParcelConstructor constructor(val name: String)
El documento específico: https://github.com/johncarl81/parceler#gettersetter-serialization
Solo agrega el constructor por defecto:
@Parcel
data class Valve(val size: Int) {
constructor() : this(0)
}