Wie kann ich mithilfe des Stacks source_gen einen Codegenerator erstellen, der Code generiert, der (genauer gesagt json_serializable
) die Eingabe eines anderen Generators ist ?
Betrachten Sie zum Beispiel:
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);
}
''';
}
}
Dies ist ein Beispiel für einen Codegenerator, der Code ausgibt, an den dann gesendet werden muss json_serializable
Was kann ich tun, damit json_serializable
hier richtig generiert wird?
await Process.start('bash',arguments,runInShell: true);
aber es ist eine Art letzter Ausweg. Eigentlich habe ich vor einem Tag alle Logiken zur Codegenerierung über diesen Repo- Link ausprobiert . Ich denke, ich kann hilfreich sein.flutter generate
/ funktionierenpub run build_runner build
. Andernfalls wäre die Verwendung sehr ungewöhnlich.Antworten:
Weitere Informationen finden Sie in der Dokumentation zur Konfigurationsdatei build.yaml. Sie sollten jedoch den
applies_builders
Parameter verwenden , mit dem ein weiterer Build nach dem definierten ausgeführt werden kann.Das Beispiel zeigt einen Builder, der .tar.gz-Dateien generiert und dann einen anderen Build ausführt, der die .tar.gz-Dateien als Eingabe verwendet
Also mit
source_gen
sollten Sie für Ihren Build implementierenund konfigurieren Sie den anderen Builder
quelle
Es ist nicht nur mit Annotation möglich, da es möglicherweise zwei Pakete gibt, die beide die
@JsonSerializable
Annotation habenEs gibt zwei Situationen:
Sie wissen, welche anderen Generatoren nach Ihrem Generator laufen sollen.
Leider gibt es derzeit keine Möglichkeit, source_gen mitzuteilen, dass Ihr Generator möglicherweise einen Code erzeugt, der Code generiert werden muss.
Ich habe hier ein Problem erstellt: https://github.com/dart-lang/source_gen/issues/442, wenn Sie sich anmelden möchten
quelle
Sie können JSON dekodieren, indem Sie die
jsonDecode()
Funktion mit der JSON-Zeichenfolge als Methodenargument aufrufen .Verwenden Sie jetzt den
User.fromJson()
Konstruktor, um eine neue Benutzerinstanz aus einer Kartenstruktur und einertoJson()
Methode zu erstellen, die eine Benutzerinstanz in eine Karte konvertiert.employee.dart
json_serializable
ist ein automatisierter Quellcode-Generator, der das JSON-Serialisierungs-Boilerplate für Sie generiert.Sie benötigen eine reguläre Abhängigkeit und zwei
json_serializable
Entwicklungsabhängigkeiten , um sie in Ihr Projekt aufzunehmen.Weitere Informationen zur JSON-Serialisierung finden Sie hier
Sie können auch die Rauchbibliothek verwenden.
Es ist eine Teilmenge der Mirrors-Funktionalität, verfügt jedoch sowohl über eine Mirrors-basierte als auch eine Codegen-basierte Implementierung. Es wurde vom PolymerDart-Team geschrieben und ist daher so nah wie möglich an "Official".
Während der Entwicklung wird die spiegelbasierte Codierung / Decodierung verwendet. Zum Veröffentlichen können Sie jedoch einen kleinen Transformator erstellen, der Code generiert.
Seth Ladd hat hier ein Codebeispiel erstellt , das ich leicht erweitert habe , um untergeordnete Objekte zu unterstützen:
quelle
json_serializable
ist nur ein Beispiel und könnte alles sein