如何在flutter中将具有文档ID的自定义对象设置为firestore中的集合?

Posted

技术标签:

【中文标题】如何在flutter中将具有文档ID的自定义对象设置为firestore中的集合?【英文标题】:how to set custom object with document id to a collection in firestore in flutter? 【发布时间】:2020-10-17 03:43:26 【问题描述】:

我用一些字符串变量和另一个 B 类的对象列表定义了一个飞镖类 A。 我在 cloud_firestore 模块中没有找到任何方法函数来将这个 A 类的自定义对象设置为集合的文档,即使 Firestore 支持自定义对象。我是否需要将 A 类的所有成员(字符串、列表等)转换为 JSON 格式或任何其他可用的解决方案?

【问题讨论】:

通过“另一个 B 类的对象列表”,我认为您的意思是 B 实例的 A 上的数组。在 firestore 中更自然的表示是 A 的子集合,或者包含 B 文档的另一个***集合。按照这种方式安排,您可以使用 SDK 中的自定义对象转换器,但您需要自己在客户端设置数组。 @danh 我正在开发一款纸牌游戏,其中 A 类代表整个游戏状态,B 类代表玩家 (>5) 状态。因此,每当玩家进行动作并且所有玩家都在收听该文档以进行更改时,都会更新集合(游戏)中的文档(游戏 ID)。我试图将所有游戏信息保存在一个文档中,以减少游戏进行时从 Firestore 读取的次数。每个卡片操作至少需要两次读取和子集合。 有趣的是,我为我和我的朋友们制作了一个纸牌游戏,供我在社交距离期间使用,我对游戏状态做出了同样的决定。我知道如何做到这一点的唯一方法是在主类的(A)转换器中转换相关的类(B)。 @danh 谢谢。这是我的第一个应用程序。我可以知道您使用哪个后端将游戏状态分发给每个玩家的每个动作吗?有什么可以玩的资源或者知道你开发的 UI 界面可以和你的朋友一起玩吗? 我使用 Firestore。每个玩家都会监听游戏状态并在他们采取行动时更新它。我在客户端使用 vue.js,UI 只是一个玩家的垂直列表,包括他们的上牌、下牌、筹码数量等。希望对您有所帮助。 【参考方案1】:

你不能插入/更新一个普通的 Dart 模型。首先,您需要将您的对象转换成 JSON 数据。为此,您可以查看this 答案。 另外,您可以查看this的答案。

【讨论】:

【参考方案2】:

如果不方便创建相关自定义类的另一个集合,唯一的选择是自己构建相关类实例。

import Player from // player module

class GameState 
  constructor(data) 
    this.players = data.players.map(p => new Player(p))
    // ...
  

  // flatten GameState into a generic JS map
  // build one of these on Player also
  asFBData() 
    const playerFBData = this.players.map(p => p.asFBData())
    return  playerFBData, ...other_game_state_here 
  


const gameStateConverter = 
  toFirestore: gameState => gameState.asFBData(),
  fromFirestore: (snapshot, options) => new GameState(snapshot.data(options))

【讨论】:

以上是关于如何在flutter中将具有文档ID的自定义对象设置为firestore中的集合?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 5 中将文档转换为自定义对象?

如何在flutter / dart中使用具有设定大小的自定义字体?

如何在iOS中将具有特定大小的自定义字体设置为Web View?

Flutter 存储共享首选项中的自定义类列表

如何在我的自定义 JSP 标记中将整数值作为参数传递?

如何在 Firestore -Flutter 中将所有文档从一个集合复制到另一个集合?