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

如何通过传入类名与属性动态生成带对应方法的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:30:45