Flutter构建工具插件build_runner的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter构建工具插件build_runner的使用

build_runner 是Dart的一个包,它提供了一种通过Dart代码生成文件的具体方法。文件总是直接在磁盘上生成,并且重新构建是增量式的,受如Bazel等工具的启发。

安装

为了支持Dart项目的开发,通常需要将build_runner添加到你的pubspec.yaml文件中作为开发依赖项(dev_dependencies)。你可以通过运行以下命令来添加:

$ dart pub add dev:build_runner

使用

内置命令

build_runner 包暴露了一个同名的二进制文件,可以通过 dart run build_runner <command> 来调用。可用的命令包括 buildwatchservetest

  • build: 执行一次构建并退出。
  • watch: 运行一个持久的构建服务器,该服务器会监视文件系统中的编辑并在必要时进行重新构建。
  • serve: 与watch类似,但同时运行一个开发服务器。
  • test: 执行一次构建,创建合并输出目录,然后运行 dart run test --precompiled <merged-output-dir>

输入

有效的输入遵循一般的Dart包规则。你可以读取任何位于顶层lib文件夹下的文件,或者来自当前包的所有文件。

输出

你可以在当前包的任何地方输出文件。需要注意的是,当BuilderApplication指定hideOutput: true时,它可以输出到任何你依赖的包的lib文件夹下。此外,生成器不允许覆盖现有文件,只能创建新文件。

源码控制

此包会在你的包中创建一个顶级.dart_tool文件夹,这个文件夹不应该提交到源码控制系统中。对于生成的文件,一般最好不将其提交到源码控制系统,但具体的Builder可能会提供不同的建议。

发布包

通常应该将生成的文件与你的包一起发布,但这可能并不总是适用。某些Builder可能会对此提供特定的建议。

示例代码

下面是一个简单的例子,展示了如何在Flutter项目中使用build_runner。假设我们有一个名为example_builder的自定义构建器,它将所有.txt文件转换为.g.dart文件。

步骤1:创建构建器

首先,我们需要创建一个构建器类。这可以放在lib/builders/example_builder.dart中:

import 'package:build/build.dart';
import 'dart:io';

Builder exampleBuilder(BuilderOptions options) => ExampleBuilder();

class ExampleBuilder implements Builder {
  @override
  final buildExtensions = const {
    '.txt': ['.g.dart']
  };

  @override
  Future<void> build(BuildStep buildStep) async {
    var inputId = buildStep.inputId;
    var content = await buildStep.readAsString(inputId);
    var outputId = inputId.changeExtension('.g.dart');
    await buildStep.writeAsString(outputId, 'String data = "$content";');
  }
}

步骤2:配置构建器

接下来,在build.yaml中配置构建器:

targets:
  $default:
    builders:
      example_builder|exampleBuilder:
        enabled: true

步骤3:执行构建

最后,你可以通过以下命令来运行构建:

$ dart run build_runner build

或者如果你希望在文件更改时自动重新构建,可以使用:

$ dart run build_runner watch

通过以上步骤,你应该能够在Flutter项目中成功使用build_runner了!如果有更多问题或需要进一步的帮助,请随时提问。


更多关于Flutter构建工具插件build_runner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter构建工具插件build_runner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,build_runner 通常指的是 build_runner 命令行工具,它通常与 build 相关的 Dart 包(如 json_serializablefreezedbuild_config 等)一起使用,用于生成代码。虽然 build_runner 本身不是一个 Flutter 插件,但它在 Flutter 开发中非常有用,特别是用于处理代码生成任务。

以下是如何在 Flutter 项目中使用 build_runner 的一个基本示例,特别是与 json_serializable 结合使用时。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加必要的依赖:

dependencies:
  flutter:
    sdk: flutter
  # 其他依赖...

dev_dependencies:
  build_runner: ^2.0.0  # 确保使用最新版本
  json_annotation: ^4.0.0  # 确保使用最新版本

2. 创建数据模型

假设你有一个数据模型 User,你想将其转换为 JSON 和从 JSON 解析:

// models/user.dart
import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';  // 这将是由 build_runner 生成的文件

@JsonSerializable()
class User {
  final String name;
  final int age;

  User({required this.name, required this.age});

  // 生成的 fromJson 和 toJson 方法
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

3. 运行 build_runner

在你的项目根目录下,打开终端并运行以下命令以生成必要的代码:

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

这将生成一个 user.g.dart 文件,其中包含 fromJsontoJson 方法的实现。

4. 使用生成的代码

现在你可以在你的 Flutter 应用中使用这些生成的方法了:

import 'package:flutter/material.dart';
import 'models/user.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 示例 JSON 数据
    String jsonString = '{"name": "Alice", "age": 30}';

    // 解析 JSON 数据
    User user = User.fromJson(jsonDecode(jsonString));

    // 将对象转换为 JSON
    String userJson = jsonEncode(user.toJson());

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter JSON Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Name: ${user.name}'),
              Text('Age: ${user.age}'),
              Text('JSON: $userJson'),
            ],
          ),
        ),
      ),
    );
  }
}

总结

以上是如何在 Flutter 项目中使用 build_runner 的一个基本示例。通过结合使用 json_annotationbuild_runner,你可以轻松地在 Dart 数据模型之间转换 JSON 数据,而无需手动编写繁琐的序列化/反序列化代码。这种方法不仅提高了开发效率,还减少了出错的可能性。

回到顶部