gpt4 book ai didi

firebase - 在 flutter 中映射 Firebase 流

转载 作者:行者123 更新时间:2023-12-02 02:03:45 24 4
gpt4 key购买 nike

我主要通过阅读这里的帖子和观看 YouTube 视频来学习 flutter,但似乎我已经达到了视频无法满足我需要的程度,所以我来这里寻求帮助。

我正在尝试了解 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();
}

因此,我根据上面的代码片段从 Firebase 获取了 QuerySnapshot。这效果很好。

然后,此 QuerySnapshot 返回到我创建 StreamProvider 的第一个代码片段中的“stream”变量。

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());

让我告诉你我认为它在做什么:

  1. 变量流有一个名为“map”的方法,调用该方法将 QuerySnapshot 映射到列表。我不确定“快照”来自哪里,但我认为它是通过此调用 firestoreService.getAgencyTrxns() 从 Firebase 返回的 QuerySnapshot。

  2. QuerySnapshot 由 Firebase 集合“trxns”中包含的文档组成。这解释了 snapshot.docs,现在我们希望使用 snapshot.docs.map() 方法将每个文档映射到列表。我使用以下代码传递要映射的每个单独文档:snapshot.docs.map(doc)。

  3. 我正在使用 Trxns.fromFirestore(doc.data)).toList() 方法将文档中包含的元素映射到列表。将返回的列表类型将是 Map (我认为)。

这是映射代码:

Trxns.fromFirestore(Map<String, dynamic> firestore)
: trxnId = firestore['trxnId'],
agentId = firestore['agentId'],
agencyId = firestore['agencyId'];

返回的 map 看起来像这样:

trxnId:某个值,代理 ID:某个值,AgencyId:某个值;

这是正确的吗?

这些都是 Trxns 类的成员,因此它现在具有 的形式。这是正确的吗?

那么,“doc.data”只是 QuerySnapshot 中文档之一的快照,对吗?

为什么我在“doc.data”上收到错误?

enter image description here

最佳答案

将其更改为此,并将其转换为Map:

return stream.map((snapshot) => snapshot.docs.map((doc) =>
Trxns.fromFirestore(doc.data() as Map<String, dynamic>)).toList());

要访问 doc 中实际的 Map,您需要使用 data() 获取所有键,或者您可以使用.get('name') 例如,获取文档中名为 name 的特定键。

So, "doc.data" is simply a snapshot of one of the documents in the QuerySnapshot, correct?

正确,QuerySnapshotDocumentSnapshots 的列表,它们在名为 docs 的对象中保存在一起。您可以对 docs 执行列表操作,例如长度,就像您对 docs.map 所做的那样。

您唯一错过的是调用data函数。当您输入 doc.data 时,此处将 data 视为对从文档中提取 {key:value} 对的函数的引用,它包含 Firebase 编写的所有幕后逻辑,但如果您在此停止而不使用 (),则不会调用此函数。

因此,只需使用 doc.data() 修复类型即可解决您的问题。

关于firebase - 在 flutter 中映射 Firebase 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68684336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com