Dart利用注解生成代碼

個(gè)人博客:
http://www.milovetingting.cn

Dart利用注解生成代碼

引入依賴

dev_dependencies:
    source_gen: ^1.2.6
    build_runner: '>2.3.0 <4.0.0'

定義注解

import 'package:meta/meta_meta.dart';

///定義注解
@Target({TargetKind.classType})
class JsonGeneratorTest {

  final String name;
  final int age;

  const JsonGeneratorTest(this.name, this.age);
}

解析注解

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},方法參數(shù):${(element as FunctionElement).parameters[0].declaration}");
  }

  template(String className, String content) {
    return """ 
      class ${className}{
        /**
        $content
        */
      }
    """;
  }
}

定義build

import 'package:source_gen/source_gen.dart';
import 'package:build/build.dart' as build;

import 'generator_impl.dart';

///配置builder
build.Builder testBuilder(build.BuilderOptions options) =>
    PartBuilder([TestGenerator()], ".gen.dart");

配置build.yaml

在根目錄下新增build.yaml

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:要導(dǎo)入的dart類型的build文件
  • builder_factories:對應(yīng)dart類型的build文件中的build.Builder方法
  • build_extensions:后綴

使用注解

import 'package:flutter_demo/generator/generator.dart';

///包含foo.gen.dart文件
part 'foo.gen.dart';

///使用注解
@JsonGeneratorTest("張三", 18)
class Foo {
  String name;
  int age;

  Foo(this.name, this.age);
}

生成代碼

flutter pub run build_runner build --delete-conflicting-outputs

--delete-conflicting-outputs:刪除沖突的文件嘿歌,可以刪除原來生成的文件

執(zhí)行命令后,會在Foo.dart同目錄下生成foo.gen.dart文件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末油宜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子走贪,更是在濱河造成了極大的恐慌朴乖,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腻窒,死亡現(xiàn)場離奇詭異滩字,居然都是意外死亡造虏,警方通過查閱死者的電腦和手機(jī)御吞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漓藕,“玉大人陶珠,你說我怎么就攤上這事∠沓” “怎么了揍诽?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長栗竖。 經(jīng)常有香客問我暑脆,道長,這世上最難降的妖魔是什么狐肢? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任添吗,我火速辦了婚禮,結(jié)果婚禮上处坪,老公的妹妹穿的比我還像新娘根资。我一直安慰自己,他們只是感情好同窘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著部脚,像睡著了一般想邦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上委刘,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天丧没,我揣著相機(jī)與錄音,去河邊找鬼锡移。 笑死呕童,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淆珊。 我是一名探鬼主播夺饲,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼施符!你這毒婦竟也來了往声?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤戳吝,失蹤者是張志新(化名)和其女友劉穎浩销,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體听哭,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慢洋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年塘雳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片普筹。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粉捻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斑芜,到底是詐尸還是另有隱情肩刃,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布杏头,位于F島的核電站盈包,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏醇王。R本人自食惡果不足惜呢燥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寓娩。 院中可真熱鬧叛氨,春花似錦、人聲如沸棘伴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焊夸。三九已至仁连,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阱穗,已是汗流浹背饭冬。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揪阶,地道東北人昌抠。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像鲁僚,于是被迫代替她去往敵國和親炊苫。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容