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 中

Flutter Streambuilder 正在复制项目

FirebaseStorage + Flutter,streamBuilder?

如何使用 StreamBuilder 更新 TextField 的值?