0

我在颤振中使用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;

这让我觉得可以,知道为什么这会引发异常吗?

4

1 回答 1

1

我将此报告为 built_value_generator 中的错误:https ://github.com/google/built_value.dart/issues/1035

生成的代码不正确地转换为 DateTime,而它应该转换为 DateTime?。

将演员表更改为DateTime 时?在生成的代码中 - 反序列化工作正常。

于 2021-05-18T09:28:41.017 回答