1

我不熟悉使用 built_value 的序列化程序,我使用 Firestore 作为后端。我想序列化我的模型,然后将给定的 Object 转换为 Map,以便将其放入 Firestore。

我在这里有这一行:

final serializedList = serializers.serialize(shoppingList, specifiedType: const FullType(ShoppingList)); //Object

setData方法仅接受数据的 Map,因此我需要将其转换为地图。

4

1 回答 1

2

基本上定义你的模型如下:

import 'package:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'serializers.dart';

part 'player.g.dart';

abstract class PlayerModel implements Built<PlayerModel, PlayerModelBuilder> {
  @nullable
  String get uid;
  String get displayName;

  PlayerModel._();
  factory PlayerModel([void Function(PlayerModelBuilder) updates]) =
      _$PlayerModel;

  Map<String, dynamic> toJson() {
    return serializers.serializeWith(PlayerModel.serializer, this);
  }

  static PlayerModel fromJson(Map<String, dynamic> json) {
    return serializers.deserializeWith(PlayerModel.serializer, json);
  }

  static Serializer<PlayerModel> get serializer => _$playerModelSerializer;
}

注意上面的 toJson 和 fromJson 方法。serializers.dart然后我在文件中定义了一个全局序列化器。

import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'player.dart';

part 'serializers.g.dart';

@SerializersFor([PlayerModel])
final Serializers serializers =
    (_$serializers.toBuilder()..addPlugin(new StandardJsonPlugin())).build();

上面的 StandardJsonPlugin 就是生成我们普遍知道的 Json。否则,built_value 将对象序列化为它自己的表示形式。

build_runner确保在进行更改后通过运行重新生成文件。

于 2020-07-25T19:09:56.257 回答