2015-11-24 11 views
12

C'è un modo per utilizzare Parceler con le classi di dati Kotlin e il costruttore per la serializzazione senza utilizzare l'annotazione @ParcelProperty per ogni campo?Utilizzo di Parceler con classe dati Kotlin con costruttore per la serializzazione

Se provo e usare biblioteca come questo:

@Parcel 
data class Valve @ParcelConstructor constructor(val size: Int) 

ottengo Error:Parceler: No corresponding property found for constructor parameter arg0. Ma se aggiungo @ParcelProperty("size") funziona perfettamente.
Perché è quello?

Aggiornamento:
ci sono altri un altro modo di usare questa libreria.
ho potuto solo rimuovere @ParcelConstructor annotazione, ma poi mi metterò errore
Error:Parceler: No @ParcelConstructor annotated constructor and no default empty bean constructor found.
credo (non ho ancora testato esso) Ho anche potuto fare tutti i parametri del costruttore facoltativa e aggiungere @JvmOverloads ma che ha un effetto collaterale che devo controlla tutte le proprietà della classe se sono nulle o meno.

Update 2:
Questo è ciò che ha funzionato per me:

@Parcel 
data class Valve(val size: Int? = null) 

Insomma classe Java generato deve avere di default costruttore vuoto. Un modo per ottenere ciò è fare come sopra: tutte le variabili dovrebbero avere valori predefiniti.

risposta

12

In base ai documenti, per impostazione predefinita Parceler funziona con campi pubblici. Ma un normale Kotlin data class (come nel tuo esempio) è piuttosto un "tradizionale getter/setter bean", poiché ogni proprietà di Kotlin è rappresentata da un campo privato e un getter/[setter].

TL; DR: penso che questo funzionerà:

@Parcel(Serialization.BEAN) 
data class Valve(val size: Int = 10) 

Annotare il valore di default, permette Kotlin di generare automaticamente uno vuoto aggiuntivo, che è richiesto dalla specifica Conosci Java.

Un altro modo sarebbe quello di segnare il costruttore che abbiamo già:

@Parcel(Serialization.BEAN) 
data class Driver @ParcelConstructor constructor(val name: String) 

Il documento specifica: https://github.com/johncarl81/parceler#gettersetter-serialization

+0

Ciò non funzionerebbe poiché richiede il costruttore di bean vuoto predefinito. Aggiornerò la mia domanda –

+0

per avere un costruttore vuoto è possibile fornire un valore predefinito a 'size'. Aggiornato – voddan

+0

o annotare il costruttore principale con '@ ParcelConstructor' proprio come nell'esempio – voddan

9

So che questa domanda ha già una risposta, ma per gli spettatori futuri che sono anche alle prese per far funzionare Parceler con gli oggetti dati di kotlin, ho scritto un nuovo processore di annotazione per generare lo schema di riscaldamento Parcelable per le classi di dati di Kotlin. E 'progettato per ridurre in maniera massiccia il codice standard nel fare i vostri classi di dati Parcelable:

https://github.com/grandstaish/paperparcel

Usage:

annotare la classe di dati con @PaperParcel, implementare PaperParcelable, e aggiungere un'istanza statica JVM del generato CREATOR es:

@PaperParcel 
data class Example(
    val test: Int, 
    ... 
) : PaperParcelable { 
    companion object { 
    @JvmField val CREATOR = PaperParcelExample.CREATOR 
    } 
} 

Ora la classe di dati è Parcelable e può essere passato direttamente a una modifica Bundle o Intent

: aggiornamento con le ultime API

3

Basta aggiungere il costruttore di default:

@Parcel 
data class Valve(val size: Int) { 
    constructor() : this(0) 
} 
+0

Why downvote? Ho avuto lo stesso problema e l'ho risolto esattamente in questo modo. – dmitriyzaitsev

+0

Questo funziona per me. BTW devi usare kapt: 'compile 'org.parceler: parceler-api: 1.1.6'' ' kapt' org.parceler: parceler: 1.1.6'' –

+0

Specificare 'size' con un valore predefinito (come menzionato sopra) dovrebbe soddisfare la necessità del costruttore senza parametri, no? – rdoubleui

Problemi correlati