Flutter资源文件生成插件flutter_asset_generator的使用

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

Flutter资源文件生成插件flutter_asset_generator的使用

简介

flutter_asset_generator 是一个帮助 Flutter 开发者自动生成资源文件对应的 Dart 文件的工具。它的目的是让开发者从重复且无意义的工作中解放出来,社区中也有很多类似的功能。

该库基于 Dart 的 build 库。

目录

截图

img

使用方法

从源码运行

  1. dart 添加到你的 $PATH 环境变量中。
  2. 克隆 flutter_asset_generator 仓库并安装依赖。
  3. 运行生成器。
git clone https://github.com/fluttercandies/flutter_asset_generator
cd flutter_asset_generator
dart pub get
dart bin/asset_generator.dart $flutter_project

从 pub global 运行

  1. 使用 pub global 安装 flutter_asset_generator
dart pub global activate flutter_asset_generator

# 或者

dart pub global activate -s git https://github.com/fluttercandies/flutter_asset_generator.git
  1. 运行以下命令:
fgen
# 或者
fgen -s $flutter_project

支持的选项

使用 fgen -hfgen --help 查看使用文档。

fgen -h
-w, --[no-]watch    继续监控变化。
                    (默认开启)

-p, --[no-]preview  生成带有预览注释的文件。
                    (默认开启)

-o, --output        资源文件路径。
                    如果是相对路径,则相对于 Flutter 项目根目录。
                    (默认为 "lib/const/resource.dart")

-s, --src           Flutter 项目根路径。
                    (默认为 ".")

-n, --name          常量类名。
                    (默认为 "R")

-h, --[no-]help     帮助文档

-d, --[no-]debug    调试信息

文件名转换规则

  • 路径中的空格、’.’ 和 ‘-’ 将被转换为 _
  • ‘@’ 将被转换为 _AT_

例如:

images/1.png => IMAGES_PNG
images/hello_world.jpg => IMAGES_HELLO_WORLD_JPG
images/hello-world.jpg => IMAGES_HELLO_WORLD_JPG

以下情况会导致错误:

images/
├── main_login.png
├── main/
    ├── login.png

因为两个字段名会完全相同。

配置文件

配置文件的位置是约定俗成的,不支持通过命令行配置。指定的路径是 Flutter 项目根目录下的 fgen.yaml

VSCode 配置方案

安装 YAML Support 插件。

配置你的 VSCode settings.json 文件,以便提示配置文件。

{
  "yaml.schemas": {
    "https://raw.githubusercontent.com/fluttercandies/flutter_asset_generator/master/fgen_schema.json": ["fgen.yaml"]
  }
}

排除和包含规则

配置文件是 YAML 格式,每个元素是 glob 风格的。

  • exclude 节点下是需要排除的文件名,类型为字符串数组。如果没有规则,则表示没有文件被排除。
  • include 节点下是需要导入的文件名,类型为字符串数组。如果没有规则,则表示所有文件都被允许。

优先级方面,排除规则高于包含规则,也就是说:

首先根据包含节点导入文件,然后排除文件。

替换规则

文件名可以根据配置文件进行替换,如下所示:

replace:
  - from: “
    to: 
  - from: ”
    to: 
  - from: ’
    to:
  - from: (
    to:
  - from: )
    to:
  - from: "!"
    to:

示例

exclude:
  - "**/add*.png"
  - "**_**"

include:
  - "**/a*.png"
  - "**/b*"
  - "**/c*"
assets
├── address.png           # 排除 by "**/add*.png"
├── address@at.png        # 排除 by "**/add*.png"
├── bluetoothon-fjdfj.png
├── bluetoothon.png
└── camera.png

images
├── address space.png     # 排除 by "**/add*.png"
├── address.png           # 排除 by "**/add*.png"
├── addto.png             # 排除 by "**/add*.png"
├── audio.png
├── bluetooth_link.png    # 排除 by **_**
├── bluetoothoff.png
├── child.png
└── course.png

生成的 Dart 文件示例:

/// 由 [asset_generator](https://github.com/fluttercandies/flutter_asset_generator) 库生成。
/// 请勿手动编辑。
class R {
  const R._();

  /// ![preview](file:///Users/jinglongcai/code/dart/self/flutter_resource_generator/example/assets/bluetoothon-fjdfj.png)
  static const String ASSETS_BLUETOOTHON_FJDFJ_PNG = 'assets/bluetoothon-fjdfj.png';

  /// ![preview](file:///Users/jinglongcai/code/dart/self/flutter_resource_generator/example/assets/bluetoothon.png)
  static const String ASSETS_BLUETOOTHON_PNG = 'assets/bluetoothon.png';

  /// ![preview](file:///Users/jinglongcai/code/dart/self/flutter_resource_generator/example/assets/camera.png)
  static const String ASSETS_CAMERA_PNG = 'assets/camera.png';

  /// ![preview](file:///Users/jinglongcai/code/dart/self/flutter_resource_generator/example/images/audio.png)
  static const String IMAGES_AUDIO_PNG = 'images/audio.png';

  /// ![preview](file:///Users/jinglongcai/code/dart/self/flutter_resource_generator/example/images/bluetoothoff.png)
  static const String IMAGES_BLUETOOTHOFF_PNG = 'images/bluetoothoff.png';

  /// ![preview](file:///Users/jinglongcai/code/dart/self/flutter_resource_generator/example/images/child.png)
  static const String IMAGES_CHILD_PNG = 'images/child.png';

  /// ![preview](file:///Users/jinglongcai/code/dart/self/flutter_resource_generator/example/images/course.png)
  static const String IMAGES_COURSE_PNG = 'images/course.png';
}

其他配置

自版本 1.1.0 起,命令配置选项也支持在配置文件中设置。但命令行选项的优先级高于配置文件。

watch: false
# watch: true

preview: false

output: lib/const/r.dart
# output: lib/const/resource.dart

name: RRR

示例代码

假设你有一个 Flutter 项目,并且项目中有以下资源文件结构:

assets
├── logo.png
├── background.jpg
└── icon.png

images
├── user.png
└── avatar.jpg

你可以创建一个 fgen.yaml 配置文件,如下所示:

exclude:
  - "**/background.jpg"

include:
  - "**/*.png"
  - "**/*.jpg"

replace:
  - from: "."
    to: "_"
  - from: "-"
    to: "_"

然后运行 fgen 命令:

fgen -s /path/to/your/flutter_project

生成的 resource.dart 文件将如下所示:

/// 由 [asset_generator](https://github.com/fluttercandies/flutter_asset_generator) 库生成。
/// 请勿手动编辑。
class R {
  const R._();

  /// ![preview](file:///path/to/your/flutter_project/assets/logo.png)
  static const String ASSETS_LOGO_PNG = 'assets/logo.png';

  /// ![preview](file:///path/to/your/flutter_project/assets/icon.png)
  static const String ASSETS_ICON_PNG = 'assets/icon.png';

  /// ![preview](file:///path/to/your/flutter_project/images/user.png)
  static const String IMAGES_USER_PNG = 'images/user.png';

  /// ![preview](file:///path/to/your/flutter_project/images/avatar.jpg)
  static const String IMAGES_AVATAR_JPG = 'images/avatar.jpg';
}

这样,你就可以在 Flutter 项目中方便地引用这些资源文件了。


更多关于Flutter资源文件生成插件flutter_asset_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter资源文件生成插件flutter_asset_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 flutter_asset_generator 插件来生成 Flutter 资源文件的示例代码和步骤。flutter_asset_generator 是一个用于自动生成 Flutter 项目中 JSON、YAML 等资源文件的 Dart 类的插件。尽管这个插件的具体实现和功能可能随时间有所变化,但以下示例将提供一个基本的指导。

1. 添加依赖

首先,你需要在你的 pubspec.yaml 文件中添加 flutter_asset_generator 依赖。

dependencies:
  flutter:
    sdk: flutter
  flutter_asset_generator: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

2. 创建资源文件

在你的 Flutter 项目中创建一个资源文件,例如 data/example.json

{
  "title": "Hello, Flutter!",
  "description": "This is an example JSON file."
}

3. 配置 build.yaml

接下来,你需要在项目的根目录下创建一个或编辑现有的 build.yaml 文件,以配置 flutter_asset_generator

targets:
  $default:
    builders:
      flutter_asset_generator:
        enabled: true
        options:
          output_extension: '.g.dart'  # 生成的 Dart 文件扩展名
          input_extensions: ['.json', '.yaml']  # 输入文件扩展名

globs:
  example_assets:
    include: 'data/*.json'  # 指定要生成资源的文件模式

4. 生成 Dart 类

运行以下命令来生成 Dart 类文件:

flutter pub run build_runner build

如果配置正确,你应该会在 data/ 目录下看到一个新生成的 Dart 文件,例如 example.json.g.dart

5. 使用生成的 Dart 类

现在你可以在你的 Flutter 应用中使用生成的 Dart 类来访问资源数据。例如:

import 'package:your_app_name/data/example.json.g.dart' as exampleData;

void main() {
  print(exampleData.defaultData['title']);  // 输出: Hello, Flutter!
  print(exampleData.defaultData['description']);  // 输出: This is an example JSON file.
}

注意:

  • your_app_name 应该替换为你的实际 Flutter 项目名称。
  • defaultData 是根据 flutter_asset_generator 的默认配置生成的类名,具体名称可能会根据你的 build.yaml 配置有所不同。

注意事项

  • 确保你的 Flutter 环境是最新的,以避免兼容性问题。
  • 插件的具体配置和使用方法可能会随着版本的更新而变化,请参考插件的官方文档以获取最新信息。
  • 如果你遇到任何问题,可以查看插件的 GitHub 仓库中的 Issues 页面,看看是否有其他人遇到并解决了类似的问题。

通过上述步骤,你应该能够成功地在 Flutter 项目中使用 flutter_asset_generator 插件来生成和使用资源文件。

回到顶部