Flutter 注解处理及代码生成,2021Android高级面试题汇总解答

再之后我们将会拿 Java-APT 与 Dart-APT 做一个对比,一方面强化你的认知,一方面介绍 Dart-APT 非常特殊的几个要点。

最后我们将对 Dart-APT 的 Generator 进行简要的源码分析,帮助你更深入的理解和使用Dart-APT。

本文大纲:

  • 1.初识 Dart-APT
  • 2.Dart-APT Api详解
  • 3.Java-APT & Dart-APT对比以及 Dart-APT 的特殊性
  • 4.Dart-APT Generator 源码浅析

初识 Dart 注解处理以及代码生成

第一节我先带你以最简单的demo,快速认识一下Flutter的注解处理和代码生成的样子,具体的API细节我们放后面细细道来。

Flutter,其实也就是Dart的注解处理依赖于 source_gen。它的详细资料可以在它的 Github 主页查看,这里我们不做过多展开,你只需要知道[ Dart-APT Powered by source_gen]

在Flutter中应用注解以及生成代码仅需一下几个步骤:

  • 1.依赖 source_gen
  • 2.创建注解
  • 3.创建生成器
  • 4.创建Builder
  • 5.编写配置文件

1.依赖 source_gen

第一步,在你工程的 pubspec.yaml 中引入 source_gen。如果你仅在本地使用且不打算将这个代码当做一个库发布出去:

dev_dependencies:
source_gen:

否则

dependencies:
source_gen:

2.创建注解和使用

比起 java 中的注解创建,Dart 的注解创建更加朴素,没有多余的关键字,实际上只是一个构造方法需要修饰成 const 的普通 Class 。

例如,申明一个没有参数的注解:

class TestMetadata {
const TestMetadata();
}

使用:

@TestMetadata()
class TestModel {}

申明一个有参数的注解:

class ParamMetadata {
final String name;
final int id;

const ParamMetadata(this.name, this.id);
}

使用:

@ParamMetadata(“test”, 1)
class TestModel {}

3.创建生成器

类似 Java-APT 的 Processor ,在 Dart 的世界里,具有相同职责的是 Generator。

你需要创建一个 Generator,继承于 GeneratorForAnnotation, 并实现: generateForAnnotatedElement 方法。

还要在 GeneratorForAnnotation 的泛型参数中填入我们要拦截的注解。

class TestGenerator extends GeneratorForAnnotation {
@override
generateForAnnotatedElement(
Element element, ConstantReader annotation, BuildStep buildStep) {
return “class Tessss{}”;
}
}

返回值是一个 String,其内容就是你将要生成的代码。

你可以通过 generateForAnnotatedElement 方法的三个参数获取注解的各种信息,用来生成相对应的代码。三个参数的具体使用我们后面细讲。

这里我们仅简单的返回一个字符串 “class Tessss{}”,用来看看效果。

4.创建Builder

Generator 的执行需要 Builder 来触发,所以现在我们要创建一个Builder。

非常简单,只需要创建一个返回类型为 Builder 的全局方法即可:

Builder testBuilder(BuilderOptions options) =>
LibraryBuilder(TestGenerator());

方法名随意,重点需要关注的是返回的对象。

示例中我们返回的是 LibraryBuilder 对象,构造方法的参数是我们上一步创建的TestGenerator对象。

实际上根据不同的需求,我们还有其他Builder对象可选,Builder 的继承树:

  • Builder
  • _Builder
  • PartBuilder

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

  • LibraryBuilder
  • SharedPartBuilder
  • MultiplexingBuilder

PartBuilder 与 SharedPartBuilder 涉及到 dart-part 关键字的使用,这里我们暂时不做展开,通常情况下 L

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值