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 中,您有 FutureBuilder
和 StreamBuilder
,它们处理异步加载的数据快照。
让我们看看我能不能覆盖它们:
- AsyncSnapshot 是 Flutter 对来自异步数据源(例如 Firestore 和实时数据库)的数据的包装器。它们涵盖了此类数据可能处于的状态,从初始连接到检索,直到出现错误或拥有数据。
- DocumentSnapshots and QuerySnapshots 是 Firestore 的 classes 代表单个文档,或者您从数据库读取时获得的文档列表。因此,如果您加载单个文档,您会得到一个
DocumentSnapshot
及其数据。如果你加载一个文档列表,你会得到一个 QuerySnapshot
然后你循环访问单个 DocumentSnapshot
s.
- A DataSnapshot 是实时数据库的 class,用于单个节点和数据库中的节点列表。
因此,在 Flutter 中,您将有一个 AsyncSnapshot
引用其中一个 Firebase 快照 classes,然后该 Firebase 快照包装实际数据。
假设您想显示一个列表,其中包含来自 Firestore 的集合中的文档,您将拥有:
- 将
AsyncSnapshot
提供给您的 StreamBuilder
,以便它可以呈现正确的数据加载状态。
- A
QuerySnapshot
用于数据库中的文档列表。
- 该列表中的每一项都是
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(),
);
},
);
}
}
随着我在 Flutter 中的代码和编码经验的进一步发展。在使用 Firebase API 时,我遇到过不同类型的快照。我说的是 AsyncSnapshots、QuerySnapshots、DocumentSnapshots 和 DataSnapshots。如果有更多请也给他们起个名字。
我想知道这些快照之间的确切区别是什么。
到目前为止,我认为 AsyncSnapshot 可能是异步拍摄的快照,这意味着小部件是在快照数据可用之前构建的,因此使其异步(如果我是,请纠正我错误的)。这是我开始困惑的地方,快照到底是什么?他们每个人的“数据”是什么。 例如:为什么同一个函数不能在所有快照中检索所需的数据,而只能在特定快照上运行。
为什么需要将数据从 QuerySnapshot 转换为 DocumentSnapshot,以使其易于访问(如果我错了,请再次纠正我)? DocumentSnapshot 和 DataSnapshot 之间的确切区别是什么。为什么它们的名称不同,当它们都是 return 地图时?
提前致谢。
据我所知,您是在 Flutter 的背景下问这个问题,所以我将在下面回答。
Firebase 中有两个数据库:原始的实时数据库和较新的 Cloud Firestore。两者在今天都是同样有效的选项,但它们与自己的 API 完全不同。但是两者都是 return 数据快照,其中快照是应用程序代码中数据库中数据的副本。
在 Flutter 中,您有 FutureBuilder
和 StreamBuilder
,它们处理异步加载的数据快照。
让我们看看我能不能覆盖它们:
- AsyncSnapshot 是 Flutter 对来自异步数据源(例如 Firestore 和实时数据库)的数据的包装器。它们涵盖了此类数据可能处于的状态,从初始连接到检索,直到出现错误或拥有数据。
- DocumentSnapshots and QuerySnapshots 是 Firestore 的 classes 代表单个文档,或者您从数据库读取时获得的文档列表。因此,如果您加载单个文档,您会得到一个
DocumentSnapshot
及其数据。如果你加载一个文档列表,你会得到一个QuerySnapshot
然后你循环访问单个DocumentSnapshot
s. - A DataSnapshot 是实时数据库的 class,用于单个节点和数据库中的节点列表。
因此,在 Flutter 中,您将有一个 AsyncSnapshot
引用其中一个 Firebase 快照 classes,然后该 Firebase 快照包装实际数据。
假设您想显示一个列表,其中包含来自 Firestore 的集合中的文档,您将拥有:
- 将
AsyncSnapshot
提供给您的StreamBuilder
,以便它可以呈现正确的数据加载状态。 - A
QuerySnapshot
用于数据库中的文档列表。 - 该列表中的每一项都是
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(),
);
},
);
}
}