Usando la pila source_gen para hacer un generador de código, ¿cómo puedo hacer un generador que genere código que sería la entrada de otro generador (más específicamente json_serializable
)?
Por ejemplo, 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 es un ejemplo de un generador de código que genera un código que luego debe enviarse a json_serializable
¿Qué puedo hacer para que json_serializable
se genere correctamente aquí?
await Process.start('bash',arguments,runInShell: true);
pero es un último recurso para jugar. En realidad, acabo de probar todas las lógicas de generación de código hace un día en este enlace de repositorio, así que ... creo que puedo ser útil.flutter generate
/pub run build_runner build
. De lo contrario, sería muy inusual de usar.Respuestas:
Consulte la documentación del archivo de configuración build.yaml para obtener más información, pero creo que debería usar el
applies_builders
parámetro que permite ejecutar otra compilación después de la definida.El ejemplo muestra un generador que genera archivos .tar.gz y luego ejecuta otra compilación que toma los archivos .tar.gz como entrada
así que con
source_gen
usted debe implementar para su compilacióny configurar el otro constructor
fuente
No es posible solo con la anotación porque puede haber dos paquetes que tienen la
@JsonSerializable
anotaciónHay dos situaciones:
Sabes qué otros generadores deberían funcionar después de tu generador.
Desafortunadamente, actualmente no hay forma de decirle a source_gen que su generador puede producir un código que necesita generación de código.
Creé un problema aquí https://github.com/dart-lang/source_gen/issues/442 si quieres suscribirte
fuente
Puede decodificar el JSON llamando a la
jsonDecode()
función, con la cadena JSON como argumento del método.Ahora, use el
User.fromJson()
constructor, para construir una nueva instancia de Usuario a partir de una estructura de mapa y untoJson()
método, que convierte una instancia de Usuario en un mapa.empleado.dart
json_serializable
es un generador de código fuente automatizado que genera la plantilla de serialización JSON para usted.Necesita una dependencia regular y dos dependencias de desarrollo para incluir
json_serializable
en su proyecto.Para obtener más detalles sobre la serialización JSON, puede consultar aquí
También puede utilizar la biblioteca de humo .
Es un subconjunto de la funcionalidad Mirrors, pero tiene una implementación basada en Mirrors y Codegen. Está escrito por el equipo de PolymerDart, por lo que es lo más cercano a "Oficial" que vamos a obtener.
Durante el desarrollo, utilizará la codificación / decodificación basada en Mirrors; pero para publicar puedes crear un pequeño transformador que generará código.
Seth Ladd creó una muestra de código aquí , que extendí ligeramente para admitir objetos secundarios:
fuente
json_serializable
es solo un ejemplo y podría ser cualquier cosa