Ich verwende derzeit das hervorragende AutoParcel in meinem Java-Projekt, das die Erstellung von Parcelable-Klassen erleichtert.
Jetzt hat Kotlin, das ich für mein nächstes Projekt in Betracht ziehe, dieses Konzept von Datenklassen, die automatisch die Methoden equals, hashCode und toString generieren.
Gibt es eine bequeme Möglichkeit, eine Kotlin-Datenklasse auf bequeme Weise parcelbar zu machen (ohne die Methoden manuell zu implementieren)?
android
parcelable
kotlin
thalesmello
quelle
quelle
Antworten:
Kotlin 1.1.4 ist raus
Das Android Extensions-Plugin enthält jetzt einen automatischen Parcelable-Implementierungsgenerator. Deklarieren Sie die serialisierten Eigenschaften in einem primären Konstruktor und fügen Sie eine @ Parcelize-Annotation hinzu. Die Methoden writeToParcel () / createFromParcel () werden automatisch erstellt:
Sie müssen sie also aktivieren, um dies dem build.gradle Ihres Moduls hinzuzufügen :
quelle
this calss implements Parcelable but does not provice CREATOR field
. Ist Ihre Antwort ausreichend (vollständig)?@SuppressLint("ParcelCreator")
, um die Flusenwarnung loszuwerden.Sie können dieses Plugin ausprobieren:
Android-Paket-Intellij-Plugin-Kotlin
Es hilft Ihnen beim Generieren von Android Parcelable Boilerplate-Code für die Datenklasse von kotlin. Und es sieht endlich so aus:
quelle
Haben Sie PaperParcel ausprobiert ? Es ist ein Anmerkungsprozessor, der automatisch den Android-
Parcelable
Boilerplate-Code für Sie generiert .Verwendung:
Anmerken Ihre Datenklasse mit
@PaperParcel
, implementierenPaperParcelable
, und fügen Sie eine JVM statische Instanz des erzeugtenCREATOR
zB:Jetzt ist
Parcelable
und kann Ihre Datenklasse direkt an einBundle
oder übergeben werdenIntent
Bearbeiten: Update mit der neuesten API
quelle
Klicken Sie einfach auf das Datenschlüsselwort Ihrer Kotlin-Datenklasse, drücken Sie Alt + Eingabetaste und wählen Sie die erste Option aus
"Add Parceable Implementation"
quelle
parcel.read...
mitTODO
, wenn ein Feld nicht istval/var
. Wenn SieList
innerhalb einer Klasse verwenden, wird Ihre Implementierung zu einem Problem. Also wandte ich mich an@Parcelize
die akzeptierte Antwort.Der beste Weg ohne Boilerplate- Code ist das Smuggler Gradle Plugin. Alles was Sie brauchen, ist nur die AutoParcelable-Schnittstelle wie zu implementieren
Und das ist alles. Funktioniert auch für versiegelte Klassen. Dieses Plugin bietet auch eine Überprüfung der Kompilierungszeit für alle AutoParcelable-Klassen.
UPD 17.08.2017 Mit Kotlin 1.1.4 und dem Kotlin Android Extensions Plugin können Sie jetzt
@Parcelize
Anmerkungen verwenden. In diesem Fall sieht das obige Beispiel folgendermaßen aus:Kein
data
Modifikator erforderlich . Der größte Nachteil ist derzeit die Verwendung des Kotlin-Android-Erweiterungs-Plugins, das viele andere Funktionen bietet, die möglicherweise unnötig sind.quelle
Mit Android Studio und dem Kotlin- Plugin habe ich eine einfache Möglichkeit gefunden, meine alten Java-
Parcelable
Dateien ohne zusätzliche Plugins zu konvertieren (wenn Sie nur eine brandneuedata
Klasse in eine verwandeln möchtenParcelable
, fahren Sie mit dem 4. Code-Snippet fort).Angenommen, Sie haben eine
Person
Klasse mit der gesamtenParcelable
Kesselplatte:Entfernen Sie zunächst die
Parcelable
Implementierung und lassen Sie ein einfaches, einfaches, altes Java- Objekt übrig (die Eigenschaften sollten endgültig sein und vom Konstruktor festgelegt werden):Dann lassen Sie die
Code > Convert Java file to Kotlin File
Option ihre Magie tun:Wandle dies in eine
data
Klasse um:Und zum Schluss machen wir daraus noch
Parcelable
einmal eine. Bewegen Sie den Mauszeiger über den Klassennamen und Android Studio sollte Ihnen die Option dazu gebenAdd Parcelable Implementation
. Das Ergebnis sollte folgendermaßen aussehen:Wie Sie sehen können, handelt es sich bei der
Parcelable
Implementierung um einen automatisch generierten Code, der an Ihredata
Klassendefinition angehängt wird .Anmerkungen:
Parcelable
direkt in Kotlin zu konvertieren, führt nicht zum gleichen Ergebnis wie die aktuelle Version des Kotlin- Plugins (1.1.3
).Parcelable
Codegenerator einführt. Muss ein kleiner Fehler sein.Ich hoffe, dieser Tipp funktioniert für Sie genauso gut wie für mich.
quelle
Ich werde meine Vorgehensweise verlassen, falls es jemandem helfen könnte.
Was ich tue, ist, dass ich ein Generikum habe
Parcelable
Und dann erstelle ich Pakete wie folgt:
Das bringt mich dazu, diesen Boilerplate-Override loszuwerden.
quelle
Beispiel:
quelle
Leider gibt es in Kotlin keine Möglichkeit, ein reales Feld in eine Schnittstelle einzufügen, sodass Sie es nicht kostenlos von einem Schnittstellenadapter erben können:
data class Par : MyParcelable
Sie können sich die Delegierung ansehen, aber es hilft nicht bei Feldern, AFAIK: https://kotlinlang.org/docs/reference/delegation.html
Die einzige Option, die ich sehe, ist eine Stofffunktion, für
Parcelable.Creator
die es offensichtlich ist.quelle
Ich bevorzuge nur die https://github.com/johncarl81/parceler lib mit
quelle
Sie können dies mithilfe von
@Parcelize
Anmerkungen tun . Es ist ein automatischer Parcelable-Implementierungsgenerator.Zuerst müssen Sie sie aktivieren, um dies dem build.gradle Ihres Moduls hinzuzufügen:
Deklarieren Sie die serialisierten Eigenschaften in einem primären Konstruktor und fügen Sie eine
@Parcelize
Anmerkung hinzu.writeToParcel()
/createFromParcel()
Methoden werden automatisch erstellt:Sie müssen NICHT
experimental = true
innerhalb desandroidExtensions
Blocks hinzufügen .quelle
Kotlin hat den gesamten Prozess der Paketierung in Android mit seiner Annotation @Parcel verdammt einfach gemacht.
Das zu tun
Schritt 1. Fügen Sie Kotlin-Erweiterungen zu Ihrem App-Modul hinzu
Schritt 2. Fügen Sie experimentell = wahr hinzu, da diese Funktion noch in Gradle experimentiert.
Schritt 3. Annonieren Sie die Datenklasse mit @Parcel
Hier ist ein einfaches Beispiel für die Verwendung von @Parcel
quelle
Es gibt ein Plugin, das jedoch nicht immer so aktualisiert ist, wie es Kotlin entwickelt: https://plugins.jetbrains.com/plugin/8086
Alternative: Ich habe ein Arbeitsbeispiel für eine benutzerdefinierte Datenklasse mit
Parcelable
und listet auf:Datenklassen mit Parcelable with Lists:
Ich hoffe es hilft!
quelle