Flutter自定义注解+build_runner无法生成user_dao.g.dart问题求助
问题解决:自定义注解+build_runner无法生成user_dao.g.dart
核心问题分析
从命令输出的警告Configuring database_generator:database_generator in target tao_bao:tao_bao but this is not a known Builder可以明确,自定义Builder未被正确注册,同时还有两个次要问题阻碍代码生成:
- UserDao文件未声明part指令,无法关联生成的
.g.dart文件 - Generator中Query方法未处理参数,会导致生成代码逻辑错误
分步解决方案
1. 修正build.yaml配置
你的build.yaml缺少正确的Builder注册配置,替换为以下内容:
targets: $default: builders: tao_bao|database_generator: enabled: true builders: database_generator: import: "package:tao_bao/db/database_generator.dart" builder_factories: ["databaseBuilder"] build_extensions: { ".dart": [".g.dart"] } auto_apply: dependents build_to: source
import指定Generator所在文件路径builder_factories对应你定义的databaseBuilder工厂方法build_extensions声明输入输出文件的后缀映射
2. 给UserDao添加part关联指令
在user_dao.dart开头添加part语句,让生成文件能和原文件建立关联:
import 'package:tao_bao/db/user_model.dart'; import 'database_annotations.dart'; // 添加这行代码 part 'user_dao.g.dart'; @Table('users') class UserDao { // ... 原有方法代码 }
3. 修复Generator中Query方法的参数处理逻辑
原Generator生成的Query方法未处理入参,会导致findByUsername这类带参数的方法生成错误,修改generateQueryMethod方法:
String generateQueryMethod(MethodElement element, String sql) { final returnType = element.returnType; final params = element.parameters.map((p) => '${p.type} ${p.name}').join(', '); final paramList = element.parameters.map((p) => p.name).join(', '); return ''' Future<$returnType> ${element.name}($params) async { final db = await dbHelper.database; final result = await db.rawQuery('$sql', [$paramList]); if (result.isNotEmpty) { return $returnType.fromMap(result.first); } return null; } '''; }
4. 重新执行构建命令
先清理缓存再执行构建,避免遗留问题:
dart run build_runner clean dart run build_runner build --delete-conflicting-outputs
验证结果
执行完命令后,lib/db目录下会生成user_dao.g.dart文件,包含自动生成的DAO实现代码。
内容的提问来源于stack exchange,提问作者vincent weng unknownparticles
相关产品推荐
相关产品推荐

