具有空安全性的 Flutter DateTime 序列化器
Flutter DateTime serializer with null safety
我在 flutter 中使用 built_value,两个库都是 null 安全的
built_value_generator: ^8.0.4
built_value: ^8.0.4
在我的模型中,我有几个 DateTime 对象,它们都可以为 null。为了序列化这些,我使用自定义序列化程序,如果字符串为 null 或为空,则 returns 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;
使用下面的序列化器(这将 return 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;
这表明 this 不能为 null,但它也有 this
DateTime? _booking_date;
DateTime? get booking_date => _$this._booking_date;
set booking_date(DateTime? booking_date) =>
_$this._booking_date = booking_date;
这让我觉得可以,知道为什么会抛出异常吗?
我将此报告为 built_value_generator 中的错误:https://github.com/google/built_value.dart/issues/1035
生成的代码对 DateTime 的转换不正确,而它应该对 DateTime 进行转换?
在生成的代码中将转换更改为 DateTime? 时 - 反序列化工作正常。
我在 flutter 中使用 built_value,两个库都是 null 安全的
built_value_generator: ^8.0.4
built_value: ^8.0.4
在我的模型中,我有几个 DateTime 对象,它们都可以为 null。为了序列化这些,我使用自定义序列化程序,如果字符串为 null 或为空,则 returns 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;
使用下面的序列化器(这将 return 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;
这表明 this 不能为 null,但它也有 this
DateTime? _booking_date;
DateTime? get booking_date => _$this._booking_date;
set booking_date(DateTime? booking_date) =>
_$this._booking_date = booking_date;
这让我觉得可以,知道为什么会抛出异常吗?
我将此报告为 built_value_generator 中的错误:https://github.com/google/built_value.dart/issues/1035
生成的代码对 DateTime 的转换不正确,而它应该对 DateTime 进行转换?
在生成的代码中将转换更改为 DateTime? 时 - 反序列化工作正常。