다른 코드 생성기에서 코드 생성기를 실행하는 방법은 무엇입니까? false) class Person { final

은 Using 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제대로 여기에 생성?



답변

자세한 내용은 build.yaml 구성 파일 설명서를 확인하십시오.하지만 정의 된 빌드 후에 다른 빌드를 실행할 수 있는 applies_builders매개 변수 를 사용해야한다고 생각합니다 .

이 예는 .tar.gz 파일을 생성 한 다음 .tar.gz 파일을 입력으로 사용하는 다른 빌드를 실행하는 빌더를 보여줍니다.

builders:
  # The regular builder config, creates .tar.gz files.
  regular_builder:
    import: "package:my_package/builder.dart"
    builder_factories: ["myBuilder"]
    build_extensions: {".dart": [".tar.gz"]}
    auto_apply: dependents
    apply_builders: [":archive_extract_builder"]
post_process_builders:
  # The post process builder config, extracts .tar.gz files.
  extract_archive_builder:
    import: "package:my_package/extract_archive_builder.dart"
    builder_factory: "myExtractArchiveBuilder"
    input_extensions: [".tar.gz"]

따라서 source_gen빌드를 구현해야합니다.

applies_builders: ["source_gen|combining_builder", "json_serializable"]

다른 빌더를 구성하십시오.

json_serializable:
    import: "package:json_serializable/builder.dart"
    builder_factories: ["jsonSerializable"]
    build_extensions: {".dart": ["json_serializable.g.part"]}
    auto_apply: dependents
    build_to: cache
    applies_builders: ["source_gen|combining_builder"]


답변

어노테이션만으로는 가능하지 않습니다. 두 패키지 모두 @JsonSerializable 주석을

두 가지 상황이 있습니다.

  • 당신은 당신의 발전기 다음에 다른 발전기가 무엇을해야하는지 알고 있습니다.

    • https://stackoverflow.com/a/59605830/6877472 는 솔루션 중 하나입니다
    • 자신의 생성기에서 다른 생성기 코드를 사용하고 해당 생성기의 .generate 함수를 호출 할 수 있습니다. 예제 코드 :

class Example extends Generator {
    @override
    String generate(LibraryReader library, BuildStep buildStep) {
      return JsonSerializable().generate('''
          @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);
          }
        ''');
     }

}
  • 당신은 당신의 발전기 다음에 다른 발전기가 무엇을 실행해야하는지 모른다.

불행히도 현재 생성기가 코드 생성이 필요한 코드를 생성 할 수 있다고 source_gen에 알리는 방법이 없습니다.

구독하려면 https://github.com/dart-lang/source_gen/issues/442 에서 문제를 만들었습니다.


답변

jsonDecode()JSON 문자열을 메소드 인수로 사용하여 함수 를 호출하여 JSON을 디코딩 할 수 있습니다 .

Map<String, dynamic> user = jsonDecode(jsonString);

print('Howdy, ${user['name']}!');
print('We sent the verification link to ${user['email']}.');

이제 User.fromJson()생성자를 사용하여 맵 구조와 toJson()사용자 인스턴스를 맵으로 변환하는 메소드 에서 새 User 인스턴스를 구성하십시오 .

employee.dart

class Employee {
  final String name;
  final String id;

  Employee(this.name, this.id);

  Employee.fromJson(Map<String, dynamic> json)
      : name = json['name'],
        id = json['id'];

  Map<String, dynamic> toJson() =>
    {
      'name': name,
      'id': id,
    };
}

json_serializable JSON 직렬화 상용구를 생성하는 자동 소스 코드 생성기입니다.

json_serializable프로젝트 에 포함하려면 하나의 정규 종속성과 두 개의 dev 종속성이 필요 합니다.

dependencies:
  json_annotation: ^0.2.3

dev_dependencies:
  build_runner: ^0.8.0
  json_serializable: ^0.5.0

JSON 직렬화에 대한 자세한 내용은 여기 를 참조 하십시오.

Smoke 라이브러리 를 사용할 수도 있습니다 .

미러 기능의 하위 세트이지만 미러 기반 구현과 Codegen 기반 구현이 모두 있습니다. PolymerDart 팀이 작성 했으므로 “공식”에 가깝습니다.

개발하는 동안 미러 기반 인코딩 / 디코딩을 사용합니다. 그러나 게시를 위해 코드를 생성하는 소형 변압기를 만들 수 있습니다.

세스 래드이 만들어 여기에 코드 샘플 내가 약간 확장 지원 아동 개체를 :


답변