flutter - 如何读取注释字段及其值(代码生成)

标签 flutter dart

我一直在努力从注释中获取字段。

我正在使用源代码生成器从我的注释生成我的小部件,但似乎无法使用注释字段,我如何访问字段和值。

我的注释:

class CoreEntity {
  final String label;

  const CoreEntity({
    this.label,
  });
}

使用注释:
@CoreEntity(
  label: 'User',
)
class User {
  String email;
}

我的小部件生成器:
class CoreWidgetGenerator extends GeneratorForAnnotation<CoreEntity> {
  @override
  FutureOr<String> generateForAnnotatedElement(
      Element element, ConstantReader annotation, BuildStep buildStep) {
    return _generateWidgetSource(element);
  }

  String _generateWidgetSource(Element element) {
    final anotData = element.metadata;
    for (ElementAnnotation el in anotData) {
      el.computeConstantValue();
      var elVisitor = ModelVisitor();
      el.element.visitChildren(elVisitor);
      print("1 ${elVisitor.className}"); // this prints out null
      print("2 ${elVisitor.fields}"); // this prints out empty list {}
    }
}

class ModelVisitor extends SimpleElementVisitor {
  DartType className;
  Map<String, DartType> fields = Map();

  @override
  visitConstructorElement(ConstructorElement element) {
    className = element.type.returnType;
    return super.visitConstructorElement(element);
  }

  @override
  visitFieldElement(FieldElement element) {
    fields[element.name] = element.type;

    return super.visitFieldElement(element);
  }
}

pubspec.yaml 中的包
dependencies:
  build: ^1.1.6
  source_gen: ^0.9.4+4 
  core_widget:
    path: ../core_widgets

构建脚本(build.yaml)
targets:
  $default:
    builders:
      core_gen|core_widget:
        enabled: true

builders:
  core_widget:
      target: ":core_gen"
      import: "package:core_gen/builder.dart"
      builder_factories: ["coreWidget"]
      build_extensions: {".dart":[".core_widget.g.part"]}
      auto_apply: dependents
      build_to: cache
      applies_builders: ["source_gen|combining_builder"]

引用资料|我做过但没有运气的研究。
  • The code is built of this tutorial
  • Similar Question
  • 最佳答案

    您已经可以通过 ConstantReader 访问注释属性

    class CoreWidgetGenerator extends GeneratorForAnnotation<CoreEntity> {
      @override
      FutureOr<String> generateForAnnotatedElement(
          Element element, ConstantReader annotation, BuildStep buildStep) {
        return _generateWidgetSource(element, annotation);
      }
    
      String _generateWidgetSource(Element element, ConstantReader annotation) {
        print(annotation.read('label').stringValue);  
      }
    }
    

    但是,如果要检索 ClassElement 字段的注释信息,可以使用 TypeChecker
    注解

    class CoreProperty {
      final String label;
    
      const CoreProperty({ this.label});
    }
    

    用法

    @CoreEntity(label: 'User')
    class User {
    
      @CoreProperty(label: 'Email')
      String email;
    }
    

    final _coreChecker = const TypeChecker.fromRuntime(CoreProperty);
    
    class CoreWidgetGenerator extends GeneratorForAnnotation<CoreEntity> {
      @override
      FutureOr<String> generateForAnnotatedElement(
          Element element, ConstantReader annotation, BuildStep buildStep) {
        return _generateWidgetSource(element as ClassElement, annotation);
      }
    
      String _generateWidgetSource(ClassElement element, ConstantReader annotation) {
    
        for (var f in element.fields) {
          if (_coreChecker.hasAnnotationOfExact(f)) {
            print(_coreChecker
              .firstAnnotationOfExact(f)
              .getField('label')
              .toStringValue()
            );
          }
        }
      }
    }
    

    关于flutter - 如何读取注释字段及其值(代码生成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57703473/

    相关文章:

    ios - ios无法安装flutter应用

    android - API可以在模拟器上运行,但现在可以在真实设备(电话)上运行。 flutter

    android - location.getLocation() 在真正的 android 设备上花费的时间太长。 flutter

    android - flutter 如何将Future <bool>设置为普通 bool 类型

    android - 已发布的 Flutter 应用程序在启动时崩溃

    Flutter - 自定义小部件 - 如何从中获取值

    android - 有没有办法知道我的 flutter 应用程序使用的是哪个 Android API 版本?

    android - 为什么我的 Flutter App 构建 APK 后会出现灰屏?

    dart - 在文本小部件中使用变量

    dart - 如何在 onTap 中使用条件语句