Firebase 中现有类型的快照之间有什么区别?

What is the difference between existing types of snapshots in Firebase?

随着我在 Flutter 中的代码和编码经验的进一步发展。在使用 Firebase API 时,我遇到过不同类型的快照。我说的是 AsyncSnapshots、QuerySnapshots、DocumentSnapshots 和 DataSnapshots。如果有更多请也给他们起个名字。

我想知道这些快照之间的确切区别是什么。

到目前为止,我认为 AsyncSnapshot 可能是异步拍摄的快照,这意味着小部件是在快照数据可用之前构建的,因此使其异步(如果我是,请纠正我错误的)。这是我开始困惑的地方,快照到底是什么?他们每个人的“数据”是什么。 例如:为什么同一个函数不能在所有快照中检索所需的数据,而只能在特定快照上运行。

为什么需要将数据从 QuerySnapshot 转换为 DocumentSnapshot,以使其易于访问(如果我错了,请再次纠正我)? DocumentSnapshot 和 DataSnapshot 之间的确切区别是什么。为什么它们的名称不同,当它们都是 return 地图时?

提前致谢。

据我所知,您是在 Flutter 的背景下问这个问题,所以我将在下面回答。

Firebase 中有两个数据库:原始的实时数据库和较新的 Cloud Firestore。两者在今天都是同样有效的选项,但它们与自己的 API 完全不同。但是两者都是 return 数据快照,其中快照是应用程序代码中数据库中数据的副本。

在 Flutter 中,您有 FutureBuilderStreamBuilder,它们处理异步加载的数据快照。

让我们看看我能不能覆盖它们:

  • AsyncSnapshot 是 Fl​​utter 对来自异步数据源(例如 Firestore 和实时数据库)的数据的包装器。它们涵盖了此类数据可能处于的状态,从初始连接到检索,直到出现错误或拥有数据。
  • DocumentSnapshots and QuerySnapshots 是 Firestore 的 classes 代表单个文档,或者您从数据库读取时获得的文档列表。因此,如果您加载单个文档,您会得到一个 DocumentSnapshot 及其数据。如果你加载一个文档列表,你会得到一个 QuerySnapshot 然后你循环访问单个 DocumentSnapshots.
  • A DataSnapshot 是实时数据库的 class,用于单个节点和数据库中的节点列表。

因此,在 Flutter 中,您将有一个 AsyncSnapshot 引用其中一个 Firebase 快照 classes,然后该 Firebase 快照包装实际数据。


假设您想显示一个列表,其中包含来自 Firestore 的集合中的文档,您将拥有:

  1. AsyncSnapshot 提供给您的 StreamBuilder,以便它可以呈现正确的数据加载状态。
  2. A QuerySnapshot 用于数据库中的文档列表。
  3. 该列表中的每一项都是 DocumentSnapshot,其中包含来自单个文档的数据快照。

实际上我发现在代码中更容易看到这一点,例如 FlutterFire documentation:

中的示例
class UserInformation extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    CollectionReference users = FirebaseFirestore.instance.collection('users');

    return StreamBuilder<QuerySnapshot>(
      stream: users.snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) {
          return Text('Something went wrong');
        }

        if (snapshot.connectionState == ConnectionState.waiting) {
          return Text("Loading");
        }

        return new ListView(
          children: snapshot.data.documents.map((DocumentSnapshot document) {
            return new ListTile(
              title: new Text(document.data()['full_name']),
              subtitle: new Text(document.data()['company']),
            );
          }).toList(),
        );
      },
    );
  }
}