📜  Dart – Builder 类(1)

📅  最后修改于: 2023-12-03 15:14:36.204000             🧑  作者: Mango

Dart - Builder 类

在 Dart 中,Builder 类是一个强大的工具,用于在运行时生成代码。用户可以使用 Builder 类来创建额外的 Dart 代码文件以及它们之间的依赖关系。Builder 类通常用于代码生成,如序列化代码、路由代码等。下面是 Builder 类的详细介绍。

Builder 类概述

Builder 类是一个抽象类,通常需要开发者继承并实现其中的方法。Builder 类可以被注入到 Dart 应用程序的构建系统中,并允许开发者生成额外的源代码文件。这些生成的文件可以是补充应用程序的一部分,也可以是独立的库。

Builder 类的 buildbuildExtensions 方法是使用该类的最基本的实现。build 方法需要开发者输入一个 BuildStep 对象,其中包含了输入文件的信息以及输出文件的路径。BuildStep 对象还包含了全部的输入资源和源文件内容。开发者需要使用这些信息来生成新的文件。

Future<void> build(BuildStep buildStep) async {
  // 读取输入文件的内容
  final inputContents = await buildStep.readAsString(buildStep.inputId);

  // 创建输出文件的路径
  final outputId = buildStep.inputId.changeExtension('.output.dart');

  // 编写生成的文件
  final outputContents = '''
    // your generated code here
  ''';

  // 完成生成
  await buildStep.writeAsString(outputId, outputContents);
}

buildExtensions 方法用于输入和输出文件扩展名之间的映射。对于所以的输入文件,开发者需要告诉 Builder 类该输入文件应该生成什么样的输出文件。

Map<String, String> get buildExtensions => {
  '.dart': '.output.dart',
};
Builder 类使用

要将 Builder 类与 Dart 应用程序的构建系统一起使用,需要使用库的 build_runner 插件。build_runner 允许开发者自动运行注入 Builder 类的代码生成和编译过程。开发者可以通过在终端中运行以下命令来启动该插件。

pub run build_runner build

这将会读取开发者的 Dart 应用程序文件夹中的所有 *.dart 文件,并查找注入的 Builder 类。然后,build_runner 将运行 build 方法,生成新的 Dart 代码文件。最后,它将根据 buildExtensions 映射,将生成的代码文件保存到工程中。

Builder 类的优缺点
优点
  • Builder 类可以创建额外的 Dart 代码文件,这些代码可以再次注入到应用程序的构建系统中,并与主应用程序的代码一样进行编译。
  • Builder 类可以在运行时进行代码生成和编译,这意味着可以根据用户的特定需求和输入来生成可用的代码。
  • 由于 Builder 类生成的代码是使用 Dart 编写的,因此无需学习其他语言或工具即可为应用程序生成自定义可运行代码。
  • Builder 类能够根据输入文件自动计算依赖关系。这意味着开发者不必手动指定组成应用程序的所有代码文件。这节省了时间并更好地管理了代码库。
  • Builder 类可以根据开发者的需求采取更高效的编译方式,可以生成更快和更简单的代码。
缺点
  • Builder 类需要 Dart 应用程序的构建系统。如果开发者尝试在没有相应支持的应用程序上使用 Builder 类,则可能会失败或出现错误。
  • 开发者需要一定的 Dart 知识来正确使用 Builder 类。这包括理解注入和基本的代码生成技术。
  • Builder 类可生成的代码部分有限。它不能替代所有的代码编写工作,而只能用于部分编译和生成。

总的来说,Builder 类是一个非常有用的工具,可以在运行时生成代码。使用 Builder 类,开发者可以自定义应用程序的代码,并按需进行编译。定义和实现一个 Builder 类需要花费一些时间,但在学习相关知识后,这样做可以节省大量的时间和精力,并为应用程序编写更高质量的代码。