Flutter资源生成插件flutter_gen_runner的使用

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

Flutter资源生成插件flutter_gen_runner的使用

简介

FlutterGen 是一个用于Flutter项目的代码生成工具,旨在为项目中的资源(如assets、fonts、colors等)提供类型安全的访问方式。通过它,你可以告别基于字符串的API,减少拼写错误带来的风险。

Pub Build Status Coverage

动机

直接使用资源路径字符串是不安全的做法:

# pubspec.yaml
flutter:
  assets:
    - assets/images/profile.jpg

Bad 如果出现拼写错误将会导致运行时错误:

Widget build(BuildContext context) {
  return Image.asset('assets/images/profile.jpeg'); // 错误的文件名
}

⭕️ Good 使用类型安全的方式:

Widget build(BuildContext context) {
  return Assets.images.profile.image();
}

安装

Homebrew (适用于macOS和Linux)

brew install FlutterGen/tap/fluttergen

asdf (适用于macOS和Linux)

# 添加插件
asdf plugin add fluttergen
# 或者
asdf plugin add fluttergen https://github.com/FlutterGen/asdf-fluttergen.git

# 安装fluttergen
asdf install fluttergen latest

更多信息请参阅 FlutterGen/asdf-fluttergen

Pub Global (适用于macOS, Linux和Windows)

dart pub global activate flutter_gen

你可能需要配置你的PATH环境变量,请参考Dart官方文档

作为build_runner的一部分

  1. build_runnerflutter_gen_runner 添加到项目的 pubspec.yaml 文件中:
dev_dependencies:
  build_runner:
  flutter_gen_runner:
  1. 安装依赖:
flutter pub get
  1. 使用 flutter_gen:
dart run build_runner build

GitHub Actions (适用于macOS和Linux)

在GitHub Actions中使用:

- uses: FlutterGen/setup-fluttergen@v1
  with:
    version: ${{ fluttergen_version }}

更多信息请参阅 FlutterGen/setup-fluttergen

使用方法

在配置好 pubspec.yaml 后,运行以下命令:

fluttergen -h # 查看帮助信息
fluttergen -c example/pubspec.yaml # 根据指定的配置文件生成代码

配置文件

FlutterGen 根据 pubspec.yaml 中的 flutterflutter_gen 部分生成 Dart 文件,默认配置可以在这里找到:默认配置

示例配置:

# pubspec.yaml
flutter_gen:
  output: lib/gen/ # 可选,默认为lib/gen/
  line_length: 80 # 可选,默认为80

  integrations:
    flutter_svg: true
    flare_flutter: true
    rive: true
    lottie: true

  colors:
    inputs:
      - assets/color/colors.xml

flutter:
  uses-material-design: true
  assets:
    - assets/images/

  fonts:
    - family: Raleway
      fonts:
        - asset: assets/fonts/Raleway-Regular.ttf
        - asset: assets/fonts/Raleway-Italic.ttf
          style: italic

示例代码

下面是一个完整的示例代码,展示了如何使用 flutter_gen 来管理资源:

import 'package:flutter/material.dart';
import 'gen/assets.gen.dart';
import 'gen/colors.gen.dart';
import 'gen/fonts.gen.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MaterialApp(
    title: 'Flutter Demo',
    theme: ThemeData(
      fontFamily: MyFontFamily.raleway,
      primarySwatch: MyColorName.crimsonRed,
    ),
    home: Scaffold(
      appBar: AppBar(
        title: const Text('FlutterGen'),
      ),
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              SizedBox(
                width: 200,
                height: 200,
                child: MyAssets.flare.penguin.flare(
                  animation: 'walk',
                  fit: BoxFit.contain,
                ),
              ),
              SizedBox(
                width: 200,
                height: 200,
                child: MyAssets.rive.vehicles.rive(
                  fit: BoxFit.contain,
                ),
              ),
              SizedBox(
                width: 200,
                height: 200,
                child: MyAssets.lottie.hamburgerArrow.lottie(
                  fit: BoxFit.contain,
                ),
              ),
              SizedBox(
                width: 200,
                height: 200,
                child: MyAssets.lottie.geometricalAnimation.lottie(
                  fit: BoxFit.contain,
                ),
              ),
              SizedBox(
                width: 200,
                height: 200,
                child: MyAssets.lottie.alarmClockLottieV440.lottie(
                  fit: BoxFit.contain,
                ),
              ),
              MyAssets.images.chip1.image(),
              Container(
                height: 400,
                decoration: BoxDecoration(
                  image: DecorationImage(
                    image: MyAssets.images.chip1.provider(),
                  ),
                ),
                child: const Center(child: Text('Deco')),
              ),
              MyAssets.images.icons.kmm.svg(key: const Key("kmm_svg")),
              MyAssets.images.icons.fuchsia.svg(),
              MyAssets.images.icons.paint.svg(
                width: 120,
                height: 120,
              ),
              Text(MyAssets.images.icons.kmm.path),
              Text(MyAssets.images.icons.kmm.keyName),
              Text(ResAssets.images.dart.path),
              Text(ResAssets.images.dart.keyName),
              ResAssets.images.flutter3.image(),
              ResAssets.images.dart.svg(),
              SizedBox(
                width: 200,
                height: 200,
                child: ResAssets.images.skills.rive(
                  fit: BoxFit.contain,
                ),
              ),
              SizedBox(
                width: 200,
                height: 200,
                child: ResAssets.images.favorite.flare(
                  shouldClip: false,
                ),
              ),
              SizedBox(
                width: 200,
                height: 200,
                child: ResAssets.images.runningCarOnRoad.lottie(
                  fit: BoxFit.contain,
                ),
              ),
              const Text(
                'Hi there, I\'m FlutterGen',
                style: TextStyle(
                  color: MyColorName.black60,
                  fontFamily: MyFontFamily.robotoMono,
                  fontFamilyFallback: [MyFontFamily.raleway],
                ),
              ),
            ],
          ),
        ),
      ),
    ),
  ));
}

这个例子展示了如何使用 flutter_gen 生成的资源类来加载图片、SVG、字体和颜色,并应用到UI组件中。希望这些内容能帮助你更好地理解和使用 flutter_gen 插件!


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

1 回复

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


在Flutter项目中,flutter_gen_runner 是一个用于生成资源文件(如图片、字符串等)的插件。它通常与 flutter_gen 一起使用,以简化资源管理和访问。下面是一个关于如何使用 flutter_gen_runner 的代码案例。

1. 安装依赖

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

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

dev_dependencies:
  build_runner: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来安装依赖。

2. 配置资源文件

假设你有一个名为 assets 的文件夹,里面包含一些图片资源,如 images/logo.png

pubspec.yaml 文件中声明这些资源:

flutter:
  assets:
    - assets/images/logo.png

3. 创建资源访问类(可选)

虽然 flutter_gen 可以自动生成资源访问代码,但为了展示如何使用,我们可以先创建一个简单的资源访问类(这个文件稍后将由 flutter_gen_runner 自动生成)。

例如,你可以手动创建一个 assets.dart 文件(这个文件之后会被自动生成的文件覆盖):

// assets.dart (这个文件会被自动生成的文件覆盖)
class Assets {
  static const String logo = 'assets/images/logo.png';
}

4. 使用 flutter_gen_runner 生成代码

在项目的根目录下,打开终端并运行以下命令来生成资源访问代码:

flutter pub run build_runner build

这个命令会调用 flutter_gen_runner 来扫描你的 pubspec.yaml 文件中的资源声明,并生成相应的 Dart 文件。

5. 使用生成的资源访问代码

生成完成后,你应该会在项目的 lib/generated 文件夹下看到自动生成的文件(例如 assets.g.dart)。这个文件包含了所有资源的访问代码。

你可以在你的 Flutter 应用中这样使用这些资源:

import 'package:your_app_name/generated/assets.g.dart';

// 使用生成的资源
Image(
  image: AssetImage(Assets.images.logo),
)

6. 确保生成的代码被包含

为了确保生成的代码在构建时被包含,你可能需要在 .gitignore 文件中添加一行来忽略生成的文件夹:

# Ignore generated files
/lib/generated/

但注意,在发布应用时,你通常不需要将这些生成的代码提交到版本控制系统中,因为它们可以从你的源代码和资源文件中自动生成。

总结

通过上述步骤,你可以使用 flutter_gen_runner 来自动生成 Flutter 项目的资源访问代码。这不仅简化了资源管理,还提高了代码的可维护性和可读性。

回到顶部