我有一堆单元格和一个同时注册所有单元格的文件,这工作正常,但我必须维护它并记住每次添加新条目,所以我尝试使用代码生成来创建这个文件,我用 @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 来产生结果并将它们写给建造者...
很可能代码对我想要实现的目标没有意义,我正在尝试将我找到的每一点信息拼凑在一起,如果有任何错误,请指出