个人博客:http://www.milovetingting.cn
Dart利用注解生成代码 引入依赖 1 2 3 dev_dependencies: source_gen: ^1.2.6 build_runner: '>2.3.0 <4.0.0'
定义注解 1 2 3 4 5 6 7 8 9 10 11 12 import 'package:meta/meta_meta.dart' ;@Target ({TargetKind.classType})class JsonGeneratorTest { final String name; final int age; const JsonGeneratorTest(this .name, this .age); }
解析注解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 import 'package:analyzer/dart/element/element.dart' ;import 'package:build/src/builder/build_step.dart' ;import 'package:source_gen/source_gen.dart' ;import 'generator.dart' ;class TestGenerator extends GeneratorForAnnotation <JsonGeneratorTest > { @override generateForAnnotatedElement( Element element, ConstantReader annotation, BuildStep buildStep) { _analyseBuildStep(buildStep); _analyseAnnotation(annotation); _analyseElement(element); return template("_\$${element.name} " , "Gen Code" ); } void _analyseBuildStep(BuildStep buildStep) { print ("buildStep:${buildStep.inputId.toString()} \n" ); } void _analyseAnnotation(ConstantReader annotation) { print ("params: ${annotation.read("name" )} \n" ); print ("params: ${annotation.read("age" )} \n" ); } void _analyseElement(Element element) { print ("ElementKind:${element.kind.name} \n" ); switch (element.kind) { case ElementKind.CLASS: _analyseElementForClass(element); break ; case ElementKind.FUNCTION: _analyseElementForMethod(element); break ; default : break ; } } void _analyseElementForClass(Element element) { var e = element as ClassElement; e.fields.forEach((element) { print ("字段:${element.declaration} \n" ); }); e.methods.forEach((element) { print ("方法:${element.declaration} " ); }); } void _analyseElementForMethod(Element element) { print ( "方法名称:${element.name} ,方法参数:${(element as FunctionElement).parameters[0 ].declaration} " ); } template(String className, String content) { return """ class ${className} { /** $content */ } """ ; } }
定义build 1 2 3 4 5 6 7 8 9 import 'package:source_gen/source_gen.dart' ;import 'package:build/build.dart' as build;import 'generator_impl.dart' ;build.Builder testBuilder(build.BuilderOptions options) => PartBuilder([TestGenerator()], ".gen.dart" );
配置build.yaml 在根目录下新增build.yaml
1 2 3 4 5 6 7 builders: testBuilder: import: "package:flutter_demo/generator/test_builder.dart" builder_factories: ["testBuilder" ] build_extensions: {".dart" : [".g.part" ]} auto_apply: root_package build_to: source
testBuilder:builder名称
Import:要导入的dart类型的build文件
builder_factories:对应dart类型的build文件中的build.Builder方法
build_extensions:后缀
使用注解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import 'package:flutter_demo/generator/generator.dart' ;part 'foo.gen.dart' ;@JsonGeneratorTest ("张三" , 18 )class Foo { String name; int age; Foo(this .name, this .age); }
生成代码 1 flutter pub run build_runner build --delete-conflicting-outputs
–delete-conflicting-outputs:删除冲突的文件,可以删除原来生成的文件
执行命令后,会在Foo.dart
同目录下生成foo.gen.dart
文件