随着我在 Flutter 中的代码和编码经验的进一步发展。我在使用 Firebase API 时遇到过不同类型的快照。我说的是 AsyncSnapshots、QuerySnapshots、DocumentSnapshots 和 DataSnapshots。如果还有更多,也请说出它们的名字。
我想知道这些快照之间的确切区别是什么。
到目前为止,我认为 AsyncSnapshot 可能是异步拍摄的快照,这意味着小部件是在快照数据可用之前构建的,因此使其异步(如果我错了,请纠正我)。这就是我的困惑开始的地方,快照到底是什么?其中每个数据中的“数据”是什么。
例如:为什么同一个函数不能在所有快照中检索所需的数据,而只能在特定快照上运行。
为什么需要将数据从 QuerySnapshot 转换为 DocumentSnapshot,以使其可访问(如果我错了,请再次纠正我)?
DocumentSnapshot 和 DataSnapshot 之间的确切区别是什么?当它们都返回 Map 时,为什么它们的调用方式不同?
先感谢您。
据我所知,您是在 Flutter 的背景下问这个问题,所以我将在下面回答。
Firebase 中有两个数据库:原始的实时数据库和较新的 Cloud Firestore。如今,两者都是同样有效的选项,但它们完全独立于自己的 API。但两者都返回数据快照,其中快照是应用程序代码中数据库中数据的副本。
在颤振中你有FutureBuilder
and StreamBuilder
,它处理异步加载的数据快照。
让我们看看我是否可以涵盖它们:
- An 异步快照 https://api.flutter.dev/flutter/widgets/AsyncSnapshot-class.html是 Flutter 对来自异步数据源(例如 Firestore 和实时数据库)的数据的包装器。它们涵盖了此类数据可以处于的状态,从初始连接到检索,直到出现错误或拥有数据。
-
文档快照 https://pub.dev/documentation/cloud_firestore/latest/cloud_firestore/DocumentSnapshot-class.htmls and 查询快照 https://pub.dev/documentation/cloud_firestore/latest/cloud_firestore/QuerySnapshot-class.htmls 是 Firestore 的类,可以表示单个文档,也可以表示从数据库读取时获取的文档列表。因此,如果您加载单个文档,您会得到一个
DocumentSnapshot
及其数据。如果您加载文档列表,您会得到一个QuerySnapshot
然后您循环访问该个人DocumentSnapshot
s.
- A 数据快照 https://pub.dev/documentation/firebase_database/latest/firebase_database/DataSnapshot-class.html是单个节点和数据库中节点列表的实时数据库类。
所以在 Flutter 中你将会有一个AsyncSnapshot
引用 Firebase 快照类之一,然后该 Firebase 快照会包装实际数据。
假设您想要显示包含 Firestore 集合中的文档的列表,您将拥有:
- An
AsyncSnapshot
喂养你的StreamBuilder
,这样就可以渲染出正确的数据加载状态。
- A
QuerySnapshot
获取数据库中的文档列表。
- 该列表中的每个项目都是
DocumentSnapshot
包含单个文档中的数据快照。
事实上,我发现在代码中更容易看到这一点,就像在这个例子中一样FlutterFire 文档 https://firebase.flutter.dev/docs/firestore/usage#realtime-changes:
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(),
);
},
);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)