Dart导入代码时无法识别part文件内_$CustomValue类如何解决?
问题原因
Dart语法规定,以下划线_开头的标识符属于库私有成员,仅支持在定义它的库内部访问,外部导入对应文件后无法识别私有类、私有属性、私有方法。
你碰到的_$CustomValue是built_value生成器默认生成的私有实现类,设计上就不允许外部直接调用,所以导入后访问会报未定义错误。
解决方案
方案1:按built_value规范使用(推荐)
不需要直接调用_$CustomValue实现类,只要在你的CustomValue抽象类中补全工厂构造和序列化器声明,即可在外部正常使用所有能力:
- 补全
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._(); }
- 外部使用序列化功能时,直接调用暴露的
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
相关产品推荐
相关产品推荐

