Usando a pilha source_gen para criar um gerador de código, como posso criar um gerador que gere código que seria a entrada de outro gerador (mais especificamente json_serializable
)?
Por exemplo, considere:
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);
}
''';
}
}
Este é um exemplo de um gerador de código que gera o código que precisa ser enviado para json_serializable
O que posso fazer para que seja json_serializable
gerado corretamente aqui?
await Process.start('bash',arguments,runInShell: true);
mas é o último recurso para jogar. na verdade, eu tentei todas as lógicas de geração de código um dia atrás neste link de repo, então acho que posso ser útil.flutter generate
/pub run build_runner build
. Caso contrário, seria muito incomum de usar.Respostas:
Verifique a documentação do arquivo de configuração build.yaml para obter mais informações, mas acho que você deve usar o
applies_builders
parâmetro que permite executar outra compilação após a definida.O exemplo mostra um construtor que gera arquivos .tar.gz e, em seguida, executa outra construção que usa os arquivos .tar.gz como entrada
então com
source_gen
você deve implementar para sua compilaçãoe configure o outro construtor
fonte
Não é possível apenas com anotação, porque talvez haja dois pacotes que tenham a
@JsonSerializable
anotaçãoExistem duas situações:
Você sabe o que outros geradores devem executar após o seu gerador.
Infelizmente, atualmente não há como dizer ao source_gen que seu gerador pode produzir um código que precisa de geração de código.
Criei um problema aqui https://github.com/dart-lang/source_gen/issues/442 se você deseja se inscrever
fonte
Você pode decodificar o JSON chamando a
jsonDecode()
função, com a cadeia JSON como argumento do método.Agora, use o
User.fromJson()
construtor, para construir uma nova instância de Usuário a partir de uma estrutura de mapa e umtoJson()
método, que converte uma instância de Usuário em um mapa.employee.dart
json_serializable
é um gerador de código-fonte automatizado que gera o padrão da serialização JSON para você.Você precisa de uma dependência regular e duas dependências de desenvolvimento para incluir
json_serializable
no seu projeto.Para mais detalhes sobre serialização JSON, você pode consultar aqui
você também pode usar a biblioteca Smoke .
É um subconjunto da funcionalidade Mirrors, mas tem uma implementação baseada em Mirrors e em Codegen. É escrito pela equipe PolymerDart, portanto é o mais próximo de "Oficial" que vamos chegar.
Durante o desenvolvimento, ele usará a codificação / decodificação baseada em Mirrors; mas para publicar, você pode criar um pequeno transformador que irá gerar código.
Seth Ladd criou um exemplo de código aqui , que estendi um pouco para oferecer suporte a objetos filho:
fonte
json_serializable
é apenas um exemplo e pode ser qualquer coisa