如何在 Flutter/Dart 中使用 SimpleElementVisitor 获取接口和方法体?

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

我正在为我的 Flutter 项目生成一些代码。我基本上想用 source_gen 重建整个类。我正在使用 SimpleElementVisitor 来获取大部分数据。我在获取字段、字段类型、方法名称和类名称时没有遇到任何问题。

这是例如我如何获得我的班级名称:

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

我想我可以获得我的第一个接口名称,例如像这样。

@override
  void visitClassElement(ClassElement element) {
    firstInterfaceName = element.interfaces.first;
  }

但不知何故,我觉得根本没有访问访问类元素函数。甚至其中的打印语句也不会被执行。其他功能都可以正常使用。

另外我怎样才能获得方法体?请不要只发布任何 ChatGPT 答案。我已经尝试过了。 预先感谢!

flutter dart code-generation
1个回答
0
投票

您的 visitClassElement 方法不起作用,因为 ElementVisitor 应该迭代的元素列表中没有单个 ClassElement。但有些方法、字段和构造函数会触发相应的方法 visitMethodElementvisitFieldElementvisitConstructorElement

但是,如果您要求您的 ElementVisitor 迭代 CompilationUnitElement 的子级(可以从 buildStep 获取),那么在其子级中有一个 ClassElement ,肯定会调用它的 visitClassElement 方法。 这是一个代码示例,将允许调用 visitClassElement 方法 -

@override
FutureOr<void> build(BuildStep buildStep) async {
  var visitor = ModelVisitor();
  final LibraryElement library = await buildStep.resolver.libraryFor(buildStep.inputId, allowSyntaxErrors: true);

  List<CompilationUnitElement> units = library.units;
  for (var unit in units) {
    unit.visitChildren(visitor);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.