Flutter:使用带有 freezed 和 json_serialized 的 Map

sha*_*ath 5 dart flutter

我有一个冻结的类,看起来像这样 -

\n\n
@freezed\nabstract class User with _$User {\n  factory User(\n      {@required String uid,\n      String firstName,\n      String lastName,\n      String email,\n      Map<String, dynamic> pictures,\n      @Default(false) bool isAdmin}) = _User;\n\n  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个类保存在cloud firestore中,我用它来读取它:

\n\n

User user = User.fromJson(dataFromFirebase);

\n\n

但我在阅读时遇到此错误:

\n\n
#0      _$_$_UserFromJson (package:my_app/freezed/freezed_classes.g.dart:15:32)\n#1      new _$_User.fromJson (package:my_app/freezed/freezed_classes.freezed.dart:68:7)\n#2      _$UserFromJson (package:my_app/freezed/freezed_classes.freezed.dart:11:16)\n#3      new User.fromJson (package:my_app/freezed/freezed_classes.dart:18:55)\n#4      FirestoreService.getUserInfo (package:my_app/services/firestore_service.dart:75:22)\n<asynchronous suspension>\n#5      FirebaseAuthService.currUserFromUserCollection (package:my_app/services/firebase_auth_service.dart:27:53)\n#6      FirebaseAuthService._userFromFirebase (package:my_app/services/firebase_auth_service.dart:17:27)\n#7      FirebaseAuthService.signInWithEmailAndPassword (package:my_app/services/firebase_auth_service.dart:47:12)\n<asynchronous suspension>\n#8      EmailPasswordSignInModel.submit (package:finc<\xe2\x80\xa6>\n
Run Code Online (Sandbox Code Playgroud)\n\n

有谁知道这里会发生什么?我尝试使用 和 作为我的 Map 类的类型(它有一个 String 键和一个 String 值),但仍然抛出相同的异常。

\n

sha*_*ath 2

好吧,我终于明白了。似乎是 json_serialized 包的问题。我在项目根目录中创建了一个名为 build.yaml 的新文件,其中包含以下内容:

\n\n
targets:\n  $default:\n    builders:\n      json_serializable:\n        options:\n          # Options configure how source code is generated for every\n          # `@JsonSerializable`-annotated class in the package.\n          #\n          # The default value for each is listed.\n          any_map: true\n          checked: false\n          create_factory: true\n          create_to_json: true\n          disallow_unrecognized_keys: false\n          explicit_to_json: false\n          field_rename: none\n          ignore_unannotated: false\n          include_if_null: true\n          nullable: true\n
Run Code Online (Sandbox Code Playgroud)\n\n

除 之外的所有值均为默认值any_map,默认情况下为 false。

\n\n

根据文档

\n\n
\n

bool anyMap :如果为 true,Map 类型不会被假定为 Map \xe2\x80\x93,这是 dart:convert 中 JSON\n 解码返回的 Map 实例的默认类型。

\n
\n\n

所以将其设置为 true 解决了我的问题!

\n