如何使用built_value

时间:2018-04-26 11:52:03

标签: dart

我有一个build_value对象,声明如下:

abstract class ParentItem<T> implements Built<ParentItem<T>, ParentItemBuilder<T>> {
  static Serializer<ParentItem> get serializer => _$parentItemSerializer;

  int get skip;
  int get limit;
  int get total;
  BuiltList<T> get items;

  ParentItem._();
  factory ParentItem([updates(ParentItemBuilder<T> b)]) = _$ParentItem<T>;
}

在dart / built_value中反序列化这个的正确方法是什么?以下工作均不起作用:

// Fails with no builder for BuiltList<dynamic><Object>.
serializers.deserializeWith(ParentItem.serializer, json);
// Fails with _$ParentItemSerializer is not a subtype of Serializer<ParentItem<ConcreteType>>
serializers.deserializeWith<ParentItem<ConcreteType>>(ParentItem.serialize, json);
// Fails with no builder for ParentItem<dynamic><ConcreteType>
serializers.deserialize(json, new FullType(ParentItem, [new FullType(ConcreteType)]);

2 个答案:

答案 0 :(得分:1)

这是对的。请注意,在某些情况下,built_value 可以为您添加构建工厂,但尚未添加。这些案件存在未解决的问题

https://github.com/google/built_value.dart/issues/124

但是对于顶级泛型,它无法知道 - 你必须自己添加它们。

答案 1 :(得分:0)

似乎built_value生成器为所有可能的具体类型创建内部使用的泛型的特定版本,如下所示:

..addBuilderFactory(
  const FullType(ParentType, const [const FullType(ConcreteType)]),
  () => new ParentTypeBuilder<ConcreteType>())

但对于顶级对象的所有组合,它不会这样做(因为它怎么可能)...所以你必须自己添加它们。