返回

Flutter 中使用 source_gen 和 code_builder 进行编译时代码生成

Android

编译时代码生成对于简化代码库的维护、减少样板代码并提高开发效率至关重要。在 Flutter 中,我们可以使用 source_gen 和 code_builder 这两个强大的库来实现这一点。

本文将逐步指导您如何在 Flutter 项目中设置并使用 source_gen 和 code_builder 来生成编译时代码。我们将从创建一个基本的 Flutter 包开始,逐步添加 source_gen 和 code_builder 的依赖项,并最终编写一个简单的代码生成示例。

设置

1. 创建 Flutter 包

首先,让我们创建一个新的 Flutter 包作为我们示例的容器。您可以使用以下命令:

flutter create --template=package annotations

这将在当前目录中创建一个名为 annotations 的新 Flutter 包。

2. 添加依赖项

接下来,我们需要向主工程的 pubspec.yaml 文件添加对 annotations 包、code_builder 和 build_runner 的依赖项:

dependencies:
  annotations: ^1.0.0
  code_builder: ^4.0.0
  build_runner: ^2.0.0

dev_dependencies:
  build_runner: ^2.0.0

3. 创建代码生成管道

现在,我们需要创建代码生成管道,该管道将由 build_runner 管理。为此,我们需要在 annotations 包中创建一个名为 build.yaml 的文件,内容如下:

targets:
  $default:
    builders:
      source_gen:
        options:
          generate_for:
            - lib/src/annotations.dart

这告诉 build_runner 使用 source_gen 生成来自 annotations.dart 文件的代码。

代码生成示例

现在,我们已经设置了编译时代码生成,让我们编写一个简单的示例来生成一个名为 MyModel 的类。

在 annotations 包的 lib/src/annotations.dart 中,添加以下代码:

import 'package:source_gen/source_gen.dart';

@Generator()
class MyModelGenerator extends Generator {
  @override
  String generate(LibraryReader library, BuildStep buildStep) {
    return '''
      class MyModel {
        final String name;

        MyModel(this.name);
      }
    ''';
  }
}

这段代码定义了一个名为 MyModelGenerator 的源代码生成器,它将在编译时生成 MyModel 类。

在主工程中,在 lib/main.dart 中,添加以下代码来使用生成器:

import 'package:annotations/annotations.dart';

@MyModel('Bob')
class Person {}

void main() {
  print(Person().name);
}

当您运行此代码时,build_runner 将使用 MyModelGenerator 生成 MyModel 类,并使用生成的代码替换带有 @MyModel 注释的类。

结论

使用 source_gen 和 code_builder,您可以在 Flutter 中轻松实现编译时代码生成。这可以显著提高开发效率,简化代码库的维护,并减少样板代码。通过本文中提供的示例,您可以开始在自己的项目中探索编译时代码生成的强大功能。