跳转至

字符串管理

1、目录结构

lib/
├─ builder.dart                             # 给 build_runner 用的工厂入口(固定)
│
├─ src/
│   └─ l10n/
│       └─ gift_strings_generator.dart   # 生成逻辑(工具代码),真正的 generator 实现
│
├─ modules/
│   └─ gift/
│       └─ l10n/
│           ├─ gift_strings.yaml         # 你需要维护的唯一配置
│           ├─ gift_strings.g.dart       # 自动生成的产物,不要手改
│           └─ gift_strings.dart         # 业务入口(export),业务只 import 这个
│
└─ main.dart

build.yaml
pubspec.yaml

2、build.yaml

builders:
  gift_strings:
    import: "package:flutter_01/builder.dart"
    builder_factories: ["generator"]
    build_extensions: {".yaml": [".g.dart"]}
    auto_apply: root_package
    build_to: source

targets:
  $default:
    builders:
      flutter_01|gift_strings:
        generate_for:
          - lib/modules/gift/l10n/gift_strings.yaml

关键解释(记住这 3 点)

  1. flutter_01 = pubspec.yamlname
  2. gift_strings = builders 里定义的 key
  3. generate_for 必须从 lib/ 开始写

3、builder.dart(最终版)

lib/builder.dart

library gift_strings_builder;

import 'package:build/build.dart';
import 'src/l10n/gift_strings_generator.dart';

Builder generator(BuilderOptions options) =>
    giftStringsBuilder(options);

📌 规则总结:

  • 必须在 lib/
  • 顶级函数
  • 返回 Builder

4、generator 实现文件位置

lib/src/l10n/gift_strings_generator.dart

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

// 你的 _GiftStringsBuilder 实现

📌 src/ 目录含义:

内部实现,不给业务层 import

5、业务模块里怎么用

lib/modules/gift/l10n/gift_strings.dart

export 'gift_strings.g.dart';

业务代码里:

import 'package:flutter_01/modules/gift/l10n/gift_strings.dart';

GiftStrings.use(
  locale: GiftLocale.zh,
  mode: GiftModuleMode.loan,
);

final s = GiftStrings.current;

6、运行

dart run build_runner build --delete-conflicting-outputs

7、最终总结

一句话版本

builder 是工具,不是业务; YAML 是唯一真源; 业务只 import .dart,永远不碰 .g.dart

🧠 记忆口诀(非常好用)

builder 在 lib/
实现进 src/
yaml 在模块
g.dart 不要动

如果你愿意,下一步我可以继续帮你:

  • 🔍 逐行 review 你现在的 generator 代码
  • 🧪 加一个 YAML 校验(缺字段直接 fail)
  • 🔁 扩展到多个模块自动扫描
  • 📦 抽成一个私有 package(公司级复用)

你只要说一句: 👉 “下一步我想把它做成 XX”