J'utilise actuellement l'excellent AutoParcel dans mon projet Java, qui facilite la création de classes Parcelable.
Maintenant, Kotlin, que je considère pour mon prochain projet, a ce concept de classes de données, qui génèrent automatiquement les méthodes equals, hashCode et toString.
Existe-t-il un moyen pratique de rendre une classe de données Kotlin Parcelable de manière pratique (sans implémenter les méthodes manuellement)?
android
parcelable
kotlin
thalesmello
la source
la source
Réponses:
Kotlin 1.1.4 est sorti
Le plugin Android Extensions comprend désormais un générateur d'implémentation Parcelable automatique. Déclarez les propriétés sérialisées dans un constructeur principal et ajoutez une annotation @Parcelize, et les méthodes writeToParcel () / createFromParcel () seront créées automatiquement:
Vous devez donc les activer en ajoutant ceci à build.gradle de votre module :
la source
this calss implements Parcelable but does not provice CREATOR field
. Votre réponse est-elle suffisante (complète)?@SuppressLint("ParcelCreator")
pour vous débarrasser de l'avertissement de peluche.Vous pouvez essayer ce plugin:
android-parcelable-intellij-plugin-kotlin
Il vous aide à générer un code standard Android Parcelable pour la classe de données de kotlin. Et cela ressemble finalement à ceci:
la source
Cliquez simplement sur le mot-clé data de votre classe de données kotlin, puis appuyez sur Alt + Entrée, sélectionnez la première option disant
"Add Parceable Implementation"
la source
parcel.read...
parTODO
, si un champ ne l'est pasval/var
. Si vous utilisez à l'List
intérieur d'une classe, votre implémentation devient un problème. Alors je me suis tourné vers@Parcelize
la réponse acceptée.Avez-vous essayé PaperParcel ? C'est un processeur d'annotation qui génère automatiquement le
Parcelable
code standard d' Android pour vous.Usage:
Annotez votre classe de données avec
@PaperParcel
, implémentezPaperParcelable
et ajoutez une instance statique JVM du fichier généré,CREATOR
par exemple:Maintenant, votre classe de données est
Parcelable
et peut être transmise directement à unBundle
ouIntent
Edit: mise à jour avec la dernière API
la source
Le meilleur moyen sans code standard du tout est le plugin Smuggler Gradle. Tout ce dont vous avez besoin est simplement d'implémenter une interface AutoParcelable comme
Et c'est tout. Fonctionne également pour les classes scellées. De plus, ce plugin fournit une validation au moment de la compilation pour toutes les classes AutoParcelable.
UPD 17.08.2017 Maintenant, avec le plugin d'extensions Kotlin 1.1.4 et Kotlin Android, vous pouvez utiliser l'
@Parcelize
annotation. Dans ce cas, l'exemple ci-dessus ressemblera à:Pas besoin de
data
modificateur. Le plus gros inconvénient, pour le moment, est l'utilisation du plugin kotlin-android-extensions qui a beaucoup d'autres fonctions qui pourraient être inutiles.la source
En utilisant Android Studio et le plugin Kotlin , j'ai trouvé un moyen simple de convertir mes anciens Java
Parcelable
s sans plugins supplémentaires (si tout ce que vous voulez est de transformer une toute nouvelledata
classe en unParcelable
, passez au 4ème extrait de code).Disons que vous avez une
Person
classe avec toute laParcelable
plaque de la chaudière:Commencez par supprimer l'
Parcelable
implémentation, en laissant un vieil objet Java pur et simple (les propriétés doivent être définitives et définies par le constructeur):Ensuite, laissez l'
Code > Convert Java file to Kotlin File
option faire sa magie:Convertissez ceci en une
data
classe:Et enfin, transformons cela en un
Parcelable
nouveau. Passez la souris sur le nom de la classe et Android Studio devrait vous donner la possibilité deAdd Parcelable Implementation
. Le résultat devrait ressembler à ceci:Comme vous pouvez le voir, l'
Parcelable
implémentation est un code généré automatiquement ajouté à votredata
définition de classe.Remarques:
Parcelable
directement en Kotlin ne produira pas le même résultat avec la version actuelle du plugin Kotlin (1.1.3
).Parcelable
générateur de code actuel introduit. Doit être un bug mineur.J'espère que cette astuce fonctionnera pour vous aussi bien que pour moi.
la source
Je quitterai ma façon de faire au cas où cela pourrait aider quelqu'un.
Ce que je fais, c'est avoir un générique
Parcelable
Et puis je crée des colis comme ceci:
Ce qui me débarrasse de ce remplacement passe-partout.
la source
Exemple :
la source
Malheureusement, il n'y a aucun moyen dans Kotlin de mettre un champ réel dans une interface, vous ne pouvez donc pas l'hériter d'un adaptateur d'interface gratuitement:
data class Par : MyParcelable
Vous pouvez regarder la délégation, mais cela n'aide pas avec les champs, AFAIK: https://kotlinlang.org/docs/reference/delegation.html
Donc, la seule option que je vois est une fonction Fabric
Parcelable.Creator
, ce qui est assez évident.la source
je préfère simplement utiliser la https://github.com/johncarl81/parceler lib avec
la source
Vous pouvez le faire en utilisant l'
@Parcelize
annotation. C'est un générateur d'implémentation Parcelable automatique.Tout d'abord, vous devez les activer en ajoutant ceci à build.gradle de votre module:
Déclarez les propriétés sérialisées dans un constructeur principal et ajoutez une
@Parcelize
annotation, et les méthodeswriteToParcel()
/createFromParcel()
seront créées automatiquement:Vous n'avez pas besoin d'ajouter un bloc
experimental = true
intérieurandroidExtensions
.la source
Kotlin a rendu tout le processus de parcellisation sous Android extrêmement facile avec son annotation @Parcel.
Pour faire ça
Étape 1. Ajoutez des extensions Kotlin dans votre module d'application gradle
Étape 2. Ajoutez experimental = true car cette fonctionnalité est toujours en expérimentation dans gradle.
Étape 3. Annonez la classe de données avec @Parcel
Voici un exemple simple d'utilisation de @Parcel
la source
Il existe un plugin mais il n'est pas toujours aussi mis à jour que Kotlin évolue: https://plugins.jetbrains.com/plugin/8086
Alternative: j'ai un exemple de travail d'une classe de données personnalisée utilisant
Parcelable
et des listes:Classes de données utilisant Parcelable with Lists:
J'espère que ça aide!
la source