Streambuilder 是从 Firestore 文档中获取所有数据还是仅获取需要的字段?
Posted
技术标签:
【中文标题】Streambuilder 是从 Firestore 文档中获取所有数据还是仅获取需要的字段?【英文标题】:Does Streambuilder fetches all the data from a firestore document or only fields that are needed? 【发布时间】:2021-11-23 03:28:13 【问题描述】:在我的应用程序中,我使用 Streambuilder 在屏幕上显示存储在 Firestore 中的计划列表(每个计划都有自己的文档):
final CollectionReference planCol = FirebaseFirestore.instance.collection('users').doc(FirebaseAuth.instance.currentUser.uid).collection('plans');
body: StreamBuilder(
stream: planCol.snapshots(),
builder: (context, snapshot)
if (snapshot.hasData)
final planDocs = snapshot.data.docs;
return ListView.builder(
itemCount: planDocs.length,
itemBuilder: (context, index) => MyListTile(
title: Text(planDocs[index]['name']),
trailing: IconButton(
icon: Icon(Icons.edit),
onPressed: ()
edit(planDocs[index]);
,
),
onTap: ()
Navigator.push(
context,
MaterialPageRoute(
builder: (context)
return ExerciseTable(
plan: UserPlan(
name: planDocs[index]['name'],
exerciseNames: planDocs[index]
['exerciseNames'],
rows: planDocs[index]['rows'],
planId: planDocs[index].id,
),
);
,
),
);
),
);
else
return Center(
child: CircularProgressIndicator(),
);
));
在这个屏幕上,我只想显示每个文档的名称,而不是存储在文档中的所有其他数据(因为它们非常大)。现在我问自己,当每个文档都很大时,Streambuilder 的工作效率如何。它是加载整个文档还是只加载文档的字段?
【问题讨论】:
【参考方案1】:在这个屏幕上,我只想显示每个文档的名称,而不是存储在文档中的所有其他数据(因为它们非常大)。
所有 Cloud Firestore 侦听器都会在文档级别触发。因此,您无法仅获取文档中单个字段的值。这就是 Firestore 的工作方式。
现在我问自己,当每个文档都很大时,Streambuilder 的工作效率如何。
更多的是下载这些文档所需的时间。
需要加载整个文档还是只加载文档的字段?
它加载整个文档。
如果您只需要一些名称,则应考虑将这些名称存储在单个文档中。在这种情况下,您只能阅读一份文档,并且只需支付一次阅读费用。
【讨论】:
谢谢!当我将名称存储在一个额外的文档中时,如何在单击一个计划后访问包含所有数据的单个文档?现在,正如您在代码中看到的那样,我通过构造函数将快照中的数据传递给 您应该创建一个指向该文档的引用。像这样rootRef/data/namesDocument
。所以基本上你应该这样做。试一试,应该可以的。如果您在实施时遇到困难,请在 *** 上发布一个新问题,其中包含您使用自己的 MCVE 尝试过的问题,以便我和其他 Firebase 开发人员可以帮助您。以上是关于Streambuilder 是从 Firestore 文档中获取所有数据还是仅获取需要的字段?的主要内容,如果未能解决你的问题,请参考以下文章
颤振开发。通过 Stream Builder 从 Firebase Storage 和 Firestore 获取数据
Flutter - 使用 StreamBuilder 提供对谷歌地图的实时更新
来自一个 StreamBuilder 的 Flutter 快照显示在另一个 StreamBuilder 中