En utilisant la pile source_gen pour créer un générateur de code, comment puis-je créer un générateur qui génère du code qui serait l'entrée d'un autre générateur (plus spécifiquement json_serializable
)?
Par exemple, considérez:
class Example extends Generator {
@override
String generate(LibraryReader library, BuildStep buildStep) {
return '''
@JsonSerializable(nullable: false)
class Person {
final String firstName;
final String lastName;
final DateTime dateOfBirth;
Person({this.firstName, this.lastName, this.dateOfBirth});
factory Person.fromJson(Map<String, dynamic> json) => _PersonFromJson(json);
Map<String, dynamic> toJson() => _PersonToJson(this);
}
''';
}
}
Ceci est un exemple de générateur de code qui génère un code qui doit ensuite être envoyé à json_serializable
Que puis-je faire pour json_serializable
générer correctement ici?
await Process.start('bash',arguments,runInShell: true);
mais c'est une sorte de dernier recours à jouer. en fait, j'ai juste essayé toutes les logiques de génération de code il y a un jour sur ce lien repo donc .. Je pense que je peux être utile.flutter generate
/pub run build_runner build
. Sinon, ce serait très inhabituel à utiliser.Réponses:
Consultez la documentation du fichier de configuration build.yaml pour plus d'informations, mais je pense que vous devriez utiliser le
applies_builders
paramètre qui permet d'exécuter une autre génération après celle définie.L'exemple montre un générateur qui génère des fichiers .tar.gz puis exécute une autre génération qui prend les fichiers .tar.gz en entrée
donc avec
source_gen
vous devez implémenter pour votre buildet configurer l'autre constructeur
la source
Ce n'est pas possible uniquement avec l'annotation car il y a peut-être deux packages qui ont tous les deux l'
@JsonSerializable
annotationIl existe deux situtations:
Vous savez quels autres générateurs doivent fonctionner après votre générateur.
Malheureusement, il n'existe actuellement aucun moyen de dire au source_gen que votre générateur peut produire un code qui nécessite une génération de code.
J'ai créé un problème ici https://github.com/dart-lang/source_gen/issues/442 si vous souhaitez vous abonner
la source
Vous pouvez décoder le JSON en appelant la
jsonDecode()
fonction, avec la chaîne JSON comme argument de méthode.Maintenant, utilisez le
User.fromJson()
constructeur pour construire une nouvelle instance User à partir d'une structure de carte et d'unetoJson()
méthode, qui convertit une instance User en carte.employé.dart
json_serializable
est un générateur de code source automatisé qui génère pour vous le passe-partout de sérialisation JSON.Vous avez besoin d'une dépendance régulière et de deux dépendances de développement à inclure
json_serializable
dans votre projet.Pour plus de détails sur la sérialisation JSON, vous pouvez vous référer ici
vous pouvez également utiliser la bibliothèque Smoke .
Il s'agit d'un sous-ensemble de la fonctionnalité Mirrors, mais il possède à la fois une implémentation basée sur Mirrors et basée sur Codegen. C'est écrit par l'équipe de PolymerDart, donc c'est aussi proche de "Officiel" que nous allons le faire.
Pendant le développement, il utilisera l'encodage / décodage basé sur les miroirs; mais pour la publication, vous pouvez créer un petit transformateur qui générera du code.
Seth Ladd a créé un exemple de code ici , que j'ai légèrement étendu pour prendre en charge les objets enfants:
la source
json_serializable
n'est qu'un exemple et pourrait être n'importe quoi