如何通过传入类名与属性动态生成带对应方法的Dart类?
动态生成带Getter/Setter的Dart类
如果你需要在运行时动态生成包含Getter、带校验Setter的Dart类源码,而不是依赖build_runner这类静态代码生成工具,可以通过字符串模板拼接的方式实现,完全自定义生成逻辑,无需重复编写模板代码。
实现步骤
1. 定义属性元数据结构
首先创建一个类来存储每个属性的关键信息:类型、名称、以及Setter的校验逻辑片段:
class PropertyConfig { final String name; final String type; final String? setterValidation; // 可选的校验代码片段 PropertyConfig({ required this.name, required this.type, this.setterValidation, }); }
2. 编写代码生成器
创建一个生成器类,接收类名和属性配置列表,拼接出完整的类源码:
class DartClassGenerator { static String generateClass(String className, List<PropertyConfig> properties) { // 拼接字段定义 final fields = properties.map((p) => ' ${p.type} ${p.name};').join('\n'); // 拼接Getter方法 final getters = properties.map((p) => ''' ${p.type} get ${p.name} { return ${p.name}; }''').join('\n'); // 拼接Setter方法 final setters = properties.map((p) { final validation = p.setterValidation ?? ''; return ''' void set ${p.name}(${p.type} ${p.name}) { $validation this.${p.name} = ${p.name}; }'''; }).join('\n'); // 组合完整类代码 return ''' class $className { $fields $getters $setters }'''; } }
3. 使用生成器生成目标类
以你提供的Student类为例,传入参数即可生成对应代码:
void main() { final studentProps = [ PropertyConfig(name: 'id', type: 'String'), PropertyConfig(name: 'name', type: 'String'), PropertyConfig( name: 'age', type: 'int', setterValidation: ''' if(age <= 0) { print("Age should be greater than 5"); return; }''', ), ]; final studentClassCode = DartClassGenerator.generateClass('Student', studentProps); print(studentClassCode); // 可选:将生成的代码写入文件 import 'dart:io'; File('student.dart').writeAsStringSync(studentClassCode); }
运行这段代码后,会输出你需要的Student类源码,还可以直接写入.dart文件供后续使用。
对比build_runner的优势
- 完全动态:无需提前编写注解、Builder或配置文件,运行时传入参数即可生成任意类
- 自定义程度高:可以灵活扩展生成逻辑,比如添加构造函数、toString方法等
- 无构建步骤:不需要执行
flutter pub run build_runner build这类命令,实时生成
注意事项
- 如果是Flutter项目,由于禁用了
dart:mirrors,字符串模板是唯一可行的动态源码生成方式 - 生成的代码需要手动引入或通过动态加载使用(比如通过
dart:isolate加载文件)
内容的提问来源于stack exchange,提问作者Anis Rafid
相关产品推荐
相关产品推荐

