You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中build_runner与source_gen无法生成输出文件的问题

排查build_runner无输出、未生成目标代码的常见问题

以下是针对你遇到的0输出、未生成sample_class.g.dart问题的分步排查方案:


1. 确认注解使用与定义的正确性

  • 确保fletch_example/lib/sample_class.dart中正确导入注解并标记目标类:
    import 'package:fletch_annotations/fletch_annotations.dart';
    
    @FletchAnnotation() // 必须添加注解,否则生成器不会触发
    class SampleClass {
      // 类内容
    }
    
  • 检查fletch_annotations中的注解类是否使用const构造函数(这是source_gen识别注解的必要条件):
    // fletch_annotations/lib/fletch_annotations.dart
    class FletchAnnotation {
      const FletchAnnotation(); // 必须是const构造,不能省略const
    }
    

2. 验证build.yaml配置

检查fletch_generator根目录下的build.yaml,确保生成器配置正确:

targets:
  $default:
    builders:
      fletch_generator|fletch_builder:
        enabled: true
        generate_for:
          - "lib/**.dart" # 确保覆盖需要处理的文件路径
        options:
          # 如有自定义配置请添加

builders:
  fletch_builder:
    import: "package:fletch_generator/fletch_generator.dart"
    builder_factories: ["fletchBuilder"] # 与生成器工厂函数名一致
    build_extensions: {".dart": [".g.dart"]} # 输出扩展名必须匹配你预期的.g.dart
    auto_apply: dependents # 确保依赖该生成器的example包能触发构建
    build_to: source # 生成文件到源码目录,而非.build文件夹
    applies_builders: ["source_gen|combining_builder"]

重点注意:build_extensions的映射关系必须正确,若写成[".fletch.g.dart"]则会生成带前缀的文件,而非你预期的.g.dart。

3. 检查生成器实现逻辑

  • 生成器需正确继承GeneratorForAnnotation或Generator,且generateForAnnotatedElement方法必须返回非空字符串(返回null/空串会被视为无输出):
    // fletch_generator/lib/fletch_generator.dart
    class FletchBuilder extends GeneratorForAnnotation<FletchAnnotation> {
      @override
      String generateForAnnotatedElement(
        Element element,
        ConstantReader annotation,
        BuildStep buildStep,
      ) {
        // 必须返回有效代码,否则不会生成文件
        return '''
        extension SampleClassExtension on SampleClass {
          void generatedMethod() {
            print("Generated method called");
          }
        }
        ''';
      }
    }
    
    // 生成器工厂函数,与build.yaml中的builder_factories对应
    Builder fletchBuilder(BuilderOptions options) => FletchBuilder();
    

4. 验证包依赖配置

在fletch_example/pubspec.yaml中确认本地包依赖路径正确,且已安装所有依赖:

dependencies:
  fletch_annotations:
    path: ../fletch_annotations

dev_dependencies:
  fletch_generator:
    path: ../fletch_generator
  build_runner: ^2.4.0
  source_gen: ^1.4.0

执行以下命令确保依赖完全加载:

flutter pub get

5. 规范build_runner命令执行

  • 必须在fletch_example目录下执行构建命令:
    flutter pub run build_runner build
    
  • 若存在缓存干扰,先清理再构建:
    flutter pub run build_runner clean
    flutter pub run build_runner build
    
  • 添加--verbose参数查看详细日志,定位具体错误:
    flutter pub run build_runner build --verbose
    

6. 检查目标文件状态

  • 确保sample_class.dart位于fletch_example/lib目录下,且未被build.yaml的generate_for规则排除
  • 检查sample_class.dart是否有语法错误(语法错误会导致build_runner跳过该文件的处理)

内容的提问来源于stack exchange,提问作者amkuchta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:15:28