Используя стек source_gen для создания генератора кода, как я могу создать генератор, который генерирует код, который будет входом другого генератора (более конкретно json_serializable
)?
Например, рассмотрим:
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);
}
''';
}
}
Это пример генератора кода, который выводит код, который затем необходимо отправить json_serializable
Что я могу сделать, чтобы json_serializable
здесь правильно генерировалось?
await Process.start('bash',arguments,runInShell: true);
но это своего рода последнее средство для игры. на самом деле я только что попробовал все логики генерации кода один день назад по этой ссылке репо, так что ... я думаю, что могу быть полезен.flutter generate
/pub run build_runner build
. В противном случае это было бы очень необычно для использования.Ответы:
Обратитесь к документации по файлу конфигурации build.yaml для получения дополнительной информации, но я думаю, что вы должны использовать
applies_builders
параметр, который позволяет выполнить другую сборку после определенной.В этом примере показан построитель, который генерирует файлы .tar.gz, а затем выполняет другую сборку, которая принимает файлы .tar.gz в качестве входных данных.
так что с
source_gen
вами следует реализовать для вашей сборкии настроить другой строитель
источник
Это невозможно только с аннотацией, потому что может быть два пакета с
@JsonSerializable
аннотациейЕсть две ситуации:
Вы знаете, какие другие генераторы должны работать после вашего генератора.
К сожалению, в настоящее время нет никакого способа сообщить source_gen, что ваш генератор может генерировать код, который требует генерации кода.
Я создал проблему здесь https://github.com/dart-lang/source_gen/issues/442, если вы хотите подписаться
источник
Вы можете декодировать JSON, вызвав
jsonDecode()
функцию со строкой JSON в качестве аргумента метода.Теперь используйте
User.fromJson()
конструктор для создания нового экземпляра пользователя из структуры карты иtoJson()
метод, который преобразует экземпляр пользователя в карту.employee.dart
json_serializable
это автоматический генератор исходного кода, который генерирует шаблон сериализации JSON для вас.Вам нужна одна обычная зависимость и две зависимости dev для включения
json_serializable
в ваш проект.Более подробную информацию о сериализации JSON вы можете найти здесь
Вы также можете использовать библиотеку Smoke .
Это подмножество функций Mirrors, но имеет реализацию на основе Mirrors и Codegen. Он написан командой PolymerDart, поэтому он настолько близок к «Официальному», насколько мы собираемся получить.
При разработке будет использоваться кодировка / декодирование на основе зеркал; но для публикации вы можете создать небольшой преобразователь, который будет генерировать код.
Сет Лэдд создал здесь пример кода , который я немного расширил для поддержки дочерних объектов:
источник
json_serializable
это просто пример и может быть чем угодно