【发布时间】:2021-10-11 12:15:21
【问题描述】:
我主要通过阅读这里的帖子和观看 YouTube 视频来学习颤振,但似乎我已经到了视频无法满足我需要的地步,所以我来这里寻求帮助。
我正在尝试了解 Streams、Firebase 和映射。
我需要使用 Riverpod 创建一个 StreamProvider。这是我用来创建 StreamProvider 的代码:
final trxnStreamProvider = StreamProvider.autoDispose<List<Trxns>>((ref) {
final stream = firestoreService.getAgencyTrxns();
return stream.map((snapshot) => snapshot.docs.map((doc) =>
Trxns.fromFirestore(doc.data)).toList());
});
我在这段代码中从 Firebase 获取流:
Stream<QuerySnapshot> getAgencyTrxns() async* {
yield* FirebaseFirestore.instance
.collection('agency').doc(globals.agencyId)
.collection('trxns')
.where('trxnStatus', isNotEqualTo: 'Closed')
.snapshots();
}
所以,我根据上面的 sn-p 从 Firebase 获得了一个 QuerySnapshot。这很好用。
然后,这个 QuerySnapshot 被返回到我创建 StreamProvider 的第一个代码 sn-p 中的“流”变量。
QuerySnapshot 变量“stream”然后被映射到 并通过此代码返回给 trxnStreamProvider。
return stream.map((snapshot) => snapshot.docs.map((doc) =>
Trxns.fromFirestore(doc.data)).toList());
我在“doc.data”中收到一个错误,说明:参数类型'对象? Function()' 不能分配给参数类型'Map
我正试图了解这行代码到底在做什么,我需要你的帮助。
return stream.map((snapshot) => snapshot.docs.map((doc) =>
Trxns.fromFirestore(doc.data)).toList());
让我告诉你我认为它在做什么:
-
变量流有一个名为“map”的方法,被调用来将QuerySnapshot映射到一个列表。我不确定“快照”来自哪里,但我认为它是 Firebase 通过此调用返回的 QuerySnapshot,firestoreService.getAgencyTrxns()。
-
QuerySnapshot 由 Firebase 集合“trxns”中包含的文档组成。这解释了 snapshot.docs,现在我们想使用 snapshot.docs.map() 方法将这些文档中的每一个映射到一个列表。我正在使用以下代码传递要映射的每个单独的文档:snapshot.docs.map(doc)。
-
我正在使用方法 Trxns.fromFirestore(doc.data)).toList() 将文档中包含的元素映射到列表。将返回的列表类型将是 Map
(我认为)。
这是映射代码:
Trxns.fromFirestore(Map<String, dynamic> firestore)
: trxnId = firestore['trxnId'],
agentId = firestore['agentId'],
agencyId = firestore['agencyId'];
在返回的地图中看起来像这样:
trxnId:某个值, agentId:某个值, agentId: somevalue;
这对吗?
这些都是 Trxns 类的成员,因此它现在具有 的形式。这是正确的吗?
所以,“doc.data”只是 QuerySnapshot 中文档之一的快照,对吗?
为什么我在“doc.data”上收到错误消息?
【问题讨论】:
标签: firebase flutter google-cloud-firestore stream