如何在Dart中创建自己的元数据?

Fre*_*ind 15 annotations metadata dart

我想为我的dart代码创建一些自己的元数据,例如@table,@ column,但我找不到任何有用的文档.

但我确实发现angular.dart中有一些特殊的元数据(例如NgController):https://github.com/angular/angular.dart/blob/master/demo/todo/web/todo.dart#L52

如何在Dart中创建自己的元数据?有文件吗?

mez*_*oni 16

Dart支持用于将用户定义的注释附加到程序结构的元数据.

元数据由一系列注释组成,每个注释以字符@开头,后跟一个以标识符开头的常量表达式.如果表达式不是以下之一,则为编译时错误:

  1. 对编译时常量变量的引用.
  2. 对常量构造函数的调用.

元数据可以出现在库,部件头,类,typedef,类型参数,构造函数,工厂,函数,字段,参数或变量声明之前以及导入,导出或部件指令之前.


因此,通过你常数这样的建议@table,@column是非常受限制的功能,因为它们无法容纳更多的信息(参数).

@DataTable("sale_orders")
class SaleOrder {
  @DataColumn("sale_order_date")
  DateTime date;
}

@table
class Product {
  @column
  String name;
}

const DataColumn column = const DataColumn();

const DataTable table = const DataTable();

class DataTable {
  final String name;

  const DataTable([this.name]);
}

class DataColumn {
  final String name;

  const DataColumn([this.name]);
}
Run Code Online (Sandbox Code Playgroud)

但无论如何,您选择最适合您需求的选项.

  • 标题有误导性。Dart 中的注释支持仅通过 build_runner 和/或 code_gen 等外部包发生。Dart 中没有对注释的原生支持。 (2认同)
  • “Dart 支持元数据,用于将用户定义的注释附加到程序结构”。来源:Dart 编程语言规范第 5 版草案版本 2.0.0-dev。https://github.com/chalin/dart-spec-and-grammar/blob/master/doc/dartLangSpec.pdf。您错误地解释了这个概念。语言始终支持元数据。另一件事是有理论(语言规范)和实践(编译器、第三方工具等)。 (2认同)
  • 答案是正确的。Dart 有非常好的反射支持。问题是它在 js 或 mobile 等编译目标中不受支持,因为摇树消除了元数据。因此,在 dart 中最常使用反射的方式是在构建阶段生成静态代码,当应用程序在 dart JIT 中加载时,元数据是可访问的。 (2认同)

Gün*_*uer 8

元数据由一系列注释组成,每个注释以字符@开头,后跟一个以标识符开头的常量表达式.

因此,您可以使用带有const构造函数的类作为注释.