Używając stosu source_gen do stworzenia generatora kodu, jak mogę stworzyć generator, który generuje kod, który byłby wejściem innego generatora (a dokładniej json_serializable
)?
Rozważ na przykład:
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);
}
''';
}
}
To jest przykład generatora kodu, który generuje kod wyjściowy, który należy następnie wysłać json_serializable
Co mogę zrobić, aby json_serializable
poprawnie generować tutaj?
await Process.start('bash',arguments,runInShell: true);
ale jest to rodzaj ostateczności. właściwie próbowałem już całą logikę generowania kodu jeden dzień temu na tym linku repo, więc .. Myślę, że mogę być pomocny.flutter generate
/pub run build_runner build
. W przeciwnym razie użycie tego byłoby bardzo nietypowe.Odpowiedzi:
Sprawdź dokumentację pliku konfiguracyjnego build.yaml, aby uzyskać więcej informacji, ale myślę, że powinieneś użyć
applies_builders
parametru, który pozwala wykonać inną kompilację po zdefiniowanej.Przykład pokazuje program budujący, który generuje pliki .tar.gz, a następnie wykonuje inną kompilację, która przyjmuje pliki .tar.gz jako dane wejściowe
więc
source_gen
powinieneś wdrożyć dla swojej kompilacjii skonfiguruj drugiego konstruktora
źródło
Nie jest to możliwe tylko z adnotacją, ponieważ może dwa pakiety mają
@JsonSerializable
adnotacjęIstnieją dwie situtacje:
Wiesz, jakie inne generatory powinny działać za twoim generatorem.
Niestety obecnie nie ma sposobu, aby powiedzieć źródłowemu genowi, że Twój generator może wygenerować kod, który wymaga wygenerowania kodu.
Stworzyłem tutaj problem https://github.com/dart-lang/source_gen/issues/442, jeśli chcesz subskrybować
źródło
Możesz zdekodować JSON, wywołując
jsonDecode()
funkcję, z łańcuchem JSON jako argumentem metody.Teraz użyj
User.fromJson()
konstruktora do skonstruowania nowej instancji użytkownika ze struktury mapy itoJson()
metody, która konwertuje instancję użytkownika w mapę.pracownik.dart
json_serializable
jest zautomatyzowanym generatorem kodu źródłowego, który generuje dla Ciebie szablon szeregowania JSON.Potrzebujesz jednej regularnej zależności i dwóch zależności deweloperskich, które chcesz uwzględnić
json_serializable
w swoim projekcie.Więcej informacji na temat serializacji JSON można znaleźć tutaj
możesz także skorzystać z biblioteki Smoke .
Jest to podzbiór funkcji Mirrors, ale ma zarówno implementację opartą na Mirrors, jak i opartą na Codegen. Jest napisany przez zespół PolymerDart, więc jest tak zbliżony do „Official”, jak to tylko możliwe.
Podczas opracowywania będzie korzystał z kodowania / dekodowania opartego na lustrach; ale do publikacji możesz stworzyć mały transformator, który wygeneruje kod.
Seth Ladd utworzył tutaj przykładowy kod , który nieco rozszerzyłem, aby obsługiwał obiekty potomne:
źródło
json_serializable
jest tylko przykładem i może być czymkolwiek