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

Dart导入代码时无法识别part文件内_$CustomValue类如何解决?

问题原因

Dart语法规定,以下划线_开头的标识符属于库私有成员,仅支持在定义它的库内部访问,外部导入对应文件后无法识别私有类、私有属性、私有方法。
你碰到的_$CustomValue是built_value生成器默认生成的私有实现类,设计上就不允许外部直接调用,所以导入后访问会报未定义错误。

解决方案

方案1:按built_value规范使用(推荐)

不需要直接调用_$CustomValue实现类,只要在你的CustomValue抽象类中补全工厂构造和序列化器声明,即可在外部正常使用所有能力:

  1. 补全custom_value.dart代码:
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';

part 'custom_value.g.dart';
    
abstract class CustomValue implements Built<CustomValue, CustomValueBuilder> {
  // 暴露序列化器
  static Serializer<CustomValue> get serializer => _$customValueSerializer;

  // 公开工厂构造,内部封装私有实现类
  factory CustomValue([void Function(CustomValueBuilder) updates]) = _$CustomValue;

  // 此处填写你自己的业务字段
  String get userName;
  int get userId;

  // 私有构造,必填
  CustomValue._();
}
  1. 外部使用序列化功能时,直接调用暴露的CustomValue.serializer即可,示例:
// 序列化
final customData = CustomValue((b) => b
  ..userName = "张三"
  ..userId = 123
);
final serialized = serializers.serialize(customData, specifiedType: const FullType(CustomValue));

// 反序列化
final CustomValue deserialized = serializers.deserialize(serialized, specifiedType: const FullType(CustomValue));

方案2:特殊场景需要直接访问实现类(不推荐)

如果你确实有特殊需求要直接调用实现类,可以在custom_value.dart文件末尾添加公开别名,把私有类映射为公开类:

typedef PublicCustomValue = _$CustomValue;

外部导入后即可通过PublicCustomValue访问原私有实现类。


内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:24:07