은 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 팀이 작성 했으므로 “공식”에 가깝습니다.
개발하는 동안 미러 기반 인코딩 / 디코딩을 사용합니다. 그러나 게시를 위해 코드를 생성하는 소형 변압기를 만들 수 있습니다.