如何在Dart中定义带下划线的公共属性?built_value序列化_id遇阻求助
关于Dart下划线属性与built_value序列化的两个问题解答
问题1:如何在Dart中定义带有下划线的公共属性?
嘿,在Dart里有个核心规则:以下划线开头的标识符默认是库私有,没法直接当作公共属性对外暴露。不过你可以通过两种方式实现类似需求:
私有字段+公共Getter
先定义一个下划线开头的私有字段,再写一个对应的公共Getter方法,让外部能安全访问它的值:class User { String _id; // 外部可以通过 user.id 访问这个值 String get id => _id; User(this._id); }序列化注解映射(适配JSON场景)
如果是为了对应JSON里的_id键,推荐用json_annotation包的@JsonKey注解,把公共属性和下划线键绑定:import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { @JsonKey(name: '_id') String id; User(this.id); factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(json); }这样外部用的是公共的
id属性,但序列化时会自动和JSON的_id对应上。
问题2:built_value处理JSON中_id键的序列化问题
确实,built_value要求模型的getter必须是公共的,私有字段的getter会被直接拒绝。解决这个问题的核心思路是字段重映射,让JSON的_id和Dart的公共属性绑定,具体做法很简单:
直接在模型的公共属性上添加@BuiltValueField注解,指定JSON里的键名是_id就行:
import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; part 'user.g.dart'; abstract class User implements Built<User, UserBuilder> { // 用wireName指定JSON中的键为_id @BuiltValueField(wireName: '_id') String? get id; User._(); factory User([void Function(UserBuilder) updates]) = _$User; static Serializer<User> get serializer => _$userSerializer; }
这样built_value在反序列化时,会自动把JSON里的_id值赋值给公共的id属性,完全避开了私有字段的限制,同时符合built_value的规范。
内容的提问来源于stack exchange,提问作者Mahdi Dahouei
相关产品推荐
相关产品推荐

