Dart语言中@符号(at符号)的具体作用是什么?
Dart中@符号的含义与用途
Dart里的@开头的标识叫做元数据注解(Metadata Annotation),作用是给代码添加额外的标记信息,这些信息可以在编译期通过静态分析、代码生成工具读取,实现特定的逻辑处理,不会影响代码本身的运行逻辑。
常见用途
- 内置规则校验:Dart SDK内置了少量常用注解,用来给编译器传递校验规则,比如示例里的
@immutable,作用是标记类的所有实例属性都必须是final不可修改的,编译器会对标注了这个注解的类做校验,如果存在非final的实例属性就会抛出编译警告。 - 第三方代码生成标记:绝大多数场景下的注解都是配合第三方代码生成套件使用的,比如Flutter开发常用的
json_serializable、freezed等工具,都是靠识别指定注解来自动生成样板代码,你给出的示例就属于这类场景:@JsonSerializable标注当前类需要自动生成JSON序列化/反序列化逻辑,括号内的参数可以配置生成规则,示例里的createToJson: false就是指仅生成反序列化的fromJson逻辑,不生成序列化的toJson逻辑@JsonKey标注当前字段和JSON键名的映射关系,示例里就是把Dart类的field1和JSON的field_1绑定,field2和field_2绑定,适配后端常用的下划线命名格式
- 自定义业务标记:你也可以根据业务需求自定义注解,配合自研的静态分析规则、代码生成逻辑实现自定义功能。
你给出的示例代码对应注解说明如下:
@immutable // 内置注解:标记该类所有实例属性不可修改 @JsonSerializable(createToJson: false) // json_serializable注解:生成反序列化逻辑,不生成序列化逻辑 class ClassA { @JsonKey(name: 'field_1') // 绑定当前字段对应JSON的key为field_1 final int field1; @JsonKey(name: 'field_2') // 绑定当前字段对应JSON的key为field_2 final String field2; const ClassA(this.field1, this.field2); // 调用json_serializable自动生成的反序列化方法 factory ClassA.fromJson(Map<String, dynamic> json) => _$ClassAFromJson(json); }
内容的提问来源于stack exchange,提问作者Akbar Pulatov
相关产品推荐
相关产品推荐

