如何减少 Flutter App 中的 Firestore 读取?

Posted

技术标签:

【中文标题】如何减少 Flutter App 中的 Firestore 读取?【英文标题】:How to reduce Firestore reads in a flutter App? 【发布时间】:2019-12-29 06:26:36 【问题描述】:

注意:我是 Flutter、android 和 Firebase 的新手。

所以,我有一个 logo Maker 应用程序,资产(PNG 图像)如面部、帽子等保存在 firestore 数据库中。我的数据库中目前共有 71 个文档。

目前,我使用cached_network_image 插件。使用此插件,图像将对单个用户只读一次。因为从下一次图像将从缓存存储中检索。但是图片标题的检索还是有问题的。

不过,对于单个用户,我获得了大约 100 次阅读!这是我的数据库的架构。

很明显,不同的部分有不同的集合,一个文件对应一个图像。

使用 StreamBuilder 检索数据,

有什么方法可以通过代码或更改数据库架构或其他方式来减少读取请求的数量?

【问题讨论】:

这是您代码中唯一可以访问 Firestone 数据库的部分吗? 好吧,因为我相信Snapshot.data.documents[index]['title'] 不是对firestore 的调用。是的,这是我访问 Firestore 数据库的唯一部分。这不应该只发出 1 个读取请求吗? 你在什么情况下使用Snapshot.data.documents[index]['title'] 在一个列中以在 UI 中显示它。编辑问题也添加了该代码! 让我们continue this discussion in chat。 【参考方案1】:

我建议的一件事是将您的 stream 声明移到您的构建方法之外,因为每次您的小部件重建该流时都会再次调用。

@override
  void initState() 
    mainStream = FirebaseFirestore.instance
        .collection('users')
        .doc('images')
        .snapshots();
    super.initState();
  

然后在 StreamBuilder 中使用 ma​​inStream。这样,您的流将在启动时初始化,并且不会在每次重建时都被调用。

另外请记住,在您每次刷新页面和查看任何文档时,在 Firebase 上查看您的数据库也算作读取次数,因此仅使用该应用时您的读取次数实际上可能不会那么高 :)

编辑:我建议进行这些更改,然后像用户一样使用您的应用程序,然后转到您的 Firebase 项目并查看过去 60 分钟的读数,这应该会告诉您更好的是你有多少实际阅读

【讨论】:

【参考方案2】:

您可能要考虑的一个选项是将内容合并到更少的文档中。

我不确定您打算如何使用数据库中的这些数据,但您的主要用例似乎是“从面孔集合中读取所有内容并将其显示在列表中”。如果是这种情况(并且这些记录相对较小),您是否需要将每张脸放在单独的文档中?如果您不打算对该列表进行分页,或者搜索和检索该集合的子集,您可以创建一个包含您所有面部数据的 JSON 对象并将其放入单个文档中。

为您的其他每条记录执行此操作,您的文档已从大约 71 个减少到 7 个。节省了 10 倍!

【讨论】:

以上是关于如何减少 Flutter App 中的 Firestore 读取?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter如何根据某个值从firebase对列表进行分组

如何有效定位Flutter内存问题?

当用户点击 Flutter App 中的 Firebase 通知时如何打开链接?

如何检测 Flutter App 代码中的热重载?

如何减少抖动中下拉列表的高度

如何使用 in_app_update 强制用户从 Flutter 中的 Play 商店更新应用