【问题标题】:Flutter CloudFirestore adding complex types throws Invalid argument: Instance of 'Team'Flutter CloudFirestore 添加复杂类型会引发无效参数:“团队”实例
【发布时间】:2019-05-14 19:57:48
【问题描述】:

我有一个类 Match,它有一个 Team 类型的其他类的列表。仅当列表为空时,才能将新文档(匹配)上传到 Firestore。一旦列表中有 Team 项目,尝试将其添加到 Firestore 会抛出“Invalid argument: Instance of 'Team'”。 Team 类只包含简单的字段,没有其他类。

StandardMessageCodec.writeValue 抛出异常

更新: 我正在使用 cloud_firestore: ^0.8.2,并调用

await firestore.collection('matches').document(match.id).setData(match);

由于除了setData(接受地图)之外没有其他方法可以上传,我尝试了match.teams(列表):

  1. 'teams':团队(列表)
  2. 'teams':完全编码为 json(字符串)
  3. 'teams' :编码单个团队项目并添加到集合(列表)

第一个选项将失败,第二个将创建单个字符串文档成员,第三个将在成员内部创建一个字符串数组,这些都不是我想要的 - 在文档内创建一个团队对象数组

【问题讨论】:

  • 您不能在 Firestore 中存储类,只能存储 JSON。 flutter.io/docs/development/data-and-backend/json
  • StandardMessageCodec.writeValue 的处理也确实对 List 类型进行了处理,我认为它支持这种数据结构。我会尝试将其展平为 json
  • 当然,JSON 支持列表,但该列表中不支持自定义类。
  • 这不像我希望的那样工作 - 如果我序列化整个列表,它将在文档中创建一个字符串成员,如果我序列化单个项目并创建一个列表,它是 Firestore 文档中的字符串数组;
  • 刚刚想通了,我应该把它做成一个 Map 列表,而不是把它展平成 jsons;感谢 Gunter 引导我找到答案

标签: dart flutter google-cloud-firestore


【解决方案1】:

要彻底解决上述问题,请按以下步骤操作:

步骤:

  1. 使用 json_serializable 插件(链接:https://pub.dev/packages/json_serializable

  2. 在您的 Match 类的以下类级别 json_serializable 注释(注意选项)

    部分'match.g.dart'; //实际文件会自动生成

    @JsonSerializable(anyMap: true, explicitToJson: true)

  3. 对你的 Team 类做同样的事情(在上面的 2 中)(你可以忽略选项:explicitToJson):

    part 'team.g.dart'; //会自动生成

    @JsonSerializable(anyMap: true)

  4. 在您的终端或控制台(在项目的根目录)中,运行:flutter pub run build_runner build 以生成所有必要的:*.g.dart 文件(即 match.g.dart , team.g.dart) 用于您的序列化类文件

    [pc-name]:[project_root_dir] [username}$ flutter pub run build_runner build

我真的希望这能像我一样帮助您彻底解决问题。

参考:https://flutter.dev/docs/development/data-and-backend/json

【讨论】:

  • 欢呼!添加 @JsonSerializable(anyMap: true, explicitToJson: true) 有效!
【解决方案2】:

在 Gunter 的帮助指出我不支持这种数据组合后,我想通了 - 需要将特定对象列表转换为地图列表

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 2017-12-07
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多