如何从flutter中的注释生成文件?

问题描述 投票:0回答:0

我有一堆单元格和一个同时注册所有单元格的文件,这工作正常,但我必须维护它并记住每次添加新条目,所以我尝试使用代码生成来创建这个文件,我用 @cell 注释了我的单元格,并用以下方法迭代它们:

class CellRegisterGenerator extends GeneratorForAnnotation<CellAnnotation> {
  @override
  String generateForAnnotatedElement(
    Element element,
    ConstantReader annotation,
    BuildStep buildStep,
  ) {
    final visitor = ModelVisitor();
    element.visitChildren(visitor);

    final clazz = visitor.className;
    final name = clazz.replaceAll("Cell", "");
    final cellName = StringUtils.camelCaseToLowerUnderscore(name);
    final builder = "${clazz[0].toLowerCase()}${clazz.substring(1)}Builder";

    return '..registerCell("$cellName", builder: $builder)\n';
  }
}
class ModelVisitor extends SimpleElementVisitor<void> {
  late String className;
  final fields = <String, dynamic>{};

  @override
  void visitConstructorElement(ConstructorElement element) {
    final elementReturnType = element.type.returnType.toString();
    className = elementReturnType.replaceFirst('*', '');
  }

  @override
  void visitFieldElement(FieldElement element) {
    final elementType = element.type.toString();
    fields[element.name] = elementType.replaceFirst('*', '');
  }
}

以及生成最终文件的构建器:

Builder generateCellRegister(BuilderOptions options) =>
    SharedPartBuilder([CellRegisterGenerator()], 'cell');

Builder cellBuilder(BuilderOptions options) {
  return CellBuilder(options);
}

const _partFiles = '.g.part';
const partIdRegExpLiteral = r'[A-Za-z_\d-]+';

class CellBuilder implements Builder {
  CellBuilder(this.builderOptions);

  final BuilderOptions builderOptions;

  final _generatedFileName = 'lib/support/board_cell_builder_config.g.dart';

  @override
  Map<String, List<String>> get buildExtensions {
    return {
      r'$package$': [_generatedFileName],
      //r'.dart': [_generatedFileName],
      //r'.dart': [ '.g.dart' ],
    };
  }

  @override
  FutureOr<void> build(BuildStep buildStep) async {
    final outputId = AssetId(
      buildStep.inputId.package,
      _generatedFileName,
    );

    final code = """
// GENERATED CODE - DO NOT MODIFY BY HAND
// GENERATED CODE - DO NOT MODIFY BY HAND
// GENERATED CODE - DO NOT MODIFY BY HAND
// GENERATED CODE - DO NOT MODIFY BY HAND

part of "cell_builder_config.dart";
class \$CellBuilderConfig {
  void setup() {
    final cells = CellBuilder.instance;
    cells
      
        Add code generated from CellRegisterGenerator here

    ; 
  }
}  
""";

    final formattedCode = DartFormatter().format(code);
    await buildStep.writeAsString(outputId, formattedCode);
  }
}

build.yaml

builders:
  cell_builder:
    import: "package:<app_name>/generators/cell_builder.dart"
    builder_factories: [ "cellBuilder" ]
    build_extensions: { ".dart": [ ".g.dart" ] }
    auto_apply: root_package
    build_to: source
    applies_builders: [ "<app_name>:cell_register" ]

  cell_register:
    import: "package:<app_name>/generators/cell_builder.dart"
    builder_factories: [ "generateCellRegister" ]
    build_extensions: { ".dart": [ ".g.part" ] }
    auto_apply: dependents
    build_to: cache
    runs_before: [ "<app_name>:cell_builder" ]

但我不知道如何连接它们,我读过可以从 CellRegisterGenerator 生成代码以缓存并从 CellBuilder 读取它,但我找不到如何...

我尝试调整 build.yaml 上的内容(构建到源/缓存),阅读 freezed、build_runner 和 src_gen 以了解它们如何工作,以搜索有关如何工作的信息和/或 Streams 来产生结果并将它们写给建造者...

很可能代码对我想要实现的目标没有意义,我正在尝试将我找到的每一点信息拼凑在一起,如果有任何错误,请指出

flutter dart annotations code-generation build-runner
© www.soinside.com 2019 - 2024. All rights reserved.