我在 flutter 中使用了 built_value,两个库都是空安全的
built_value_generator: ^8.0.4
built_value: ^8.0.4
在我的模型中,我有一些 DateTime 对象,它们都可以为空。为了序列化这些,我使用了一个自定义序列化程序,如果字符串为 null 或为空,则该序列化程序返回 null。但是会抛出异常
Deserializing '[data, [{_id: 609e6ea910fd591efebd61a3, booking_id:
609e6ea99fe023fde50aa375,...' to 'BookingResponse' failed due to: Deserializing '[{_id:
609e6ea910fd591efebd61a3, booking_id: 609e6ea99fe023fde50aa375, client...' to
'BuiltList<Booking>' failed due to: Deserializing '[_id, 609e6ea910fd591efebd61a3,
booking_id, 609e6ea99fe023fde50aa375, client,...' to 'Booking' failed due to: type 'Null'
is not a subtype of type 'DateTime' in type cast
当我将一个空字符串反序列化为我的模型中声明的 DateTime 时会发生异常,如下所示:
DateTime? get booking_date;
使用下面的序列化程序(将返回 null)
class DateTimeSerializer implements PrimitiveSerializer<DateTime?> {
@override
DateTime? deserialize(Serializers serializers, Object? serialized, {FullType specifiedType = FullType.unspecified}) {
logger('DateTime.deserialize: $serialized');
if (serialized != null && serialized is String && serialized.isNotEmpty) {
logger('DateTime.deserialize parse: $serialized');
return DateTime.parse(serialized).toLocal();
} else {
return null;
}
}
@override
Object serialize(Serializers serializers, DateTime? object, {FullType specifiedType = FullType.unspecified}) {
logger('DateTime.serialize: $object');
if (object != null) {
return object.toUtc().toIso8601String();
} else {
return Object();
}
}
@override
Iterable<Type> get types => [DateTime];
@override
String get wireName => 'DateTime';
}
在我生成的模型中,我可以看到:
case 'booking_date':
result.booking_date = serializers.deserialize(value,
specifiedType: const FullType(DateTime)) as DateTime;
break;
这表明这不能为空,但它也有这个
DateTime? _booking_date;
DateTime? get booking_date => _$this._booking_date;
set booking_date(DateTime? booking_date) =>
_$this._booking_date = booking_date;
这让我觉得可以,知道为什么会抛出异常吗?
答案 0 :(得分:1)
我将此报告为 built_value_generator 中的错误:https://github.com/google/built_value.dart/issues/1035
生成的代码不正确地转换为 DateTime,而它应该转换为 DateTime?。
在生成的代码中将强制转换为 DateTime? 时 - 反序列化工作正常。