【问题标题】:Flutter: Using Map with freezed and json_serializableFlutter:将 Map 与 freezed 和 json_serializable 结合使用
【发布时间】:2020-03-19 09:03:59
【问题描述】:

我有一个看起来像这样的冻结课程 -

@freezed
abstract class User with _$User {
  factory User(
      {@required String uid,
      String firstName,
      String lastName,
      String email,
      Map<String, dynamic> pictures,
      @Default(false) bool isAdmin}) = _User;

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}

这个类保存在云火库中,我正在使用它来阅读它:

User user = User.fromJson(dataFromFirebase);

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

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

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

【问题讨论】:

标签: flutter dart


【解决方案1】:

当我在没有类型声明的情况下将 Item 对象的 Map 添加到我的 Client 类时,我遇到了与 json_serializable 相同的错误并冻结。

之前(触发错误时)

注意 Map items, 没有特定的类型声明。这适用于普通飞镖。

@freezed
abstract class Client with _$Client {
  const factory Client(
      String id,
      String name,
      int createdDate,
      int updatedDate,
      List<UploadJob> uploadJobs,
      Map items,
      int clientModelVersion) = _Client;

  factory Client.fromJson(Map<String, dynamic> json) => _$ClientFromJson(json);
}

之后(正确生成)

注意 Map&lt;String, Item&gt; items,key 声明为 String,将 value 声明为 Item > 对象。现在可以正常生成了。

@freezed
abstract class Client with _$Client {
  const factory Client(
      String id,
      String name,
      int createdDate,
      int updatedDate,
      List<UploadJob> uploadJobs,
      Map<String, Item> items,
      int clientModelVersion) = _Client;

  factory Client.fromJson(Map<String, dynamic> json) => _$ClientFromJson(json);
}

通过此更改,我无需使用 build.yaml 文件来声明 any_map

【讨论】:

    【解决方案2】:

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

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

    所有值都是默认值,any_map 除外,默认为 false。

    根据documentation

    bool anyMap : 如果为 true,则 Map 类型不假定为 Map - 这是 JSON 返回的 Map 实例的默认类型 在 dart:convert 中解码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2021-07-19
      • 2020-09-11
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      相关资源
      最近更新 更多