You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:57:32