【问题标题】:Mapping Firebase streams in flutter在颤动中映射 Firebase 流
【发布时间】: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());

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

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

  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'];

在返回的地图中看起来像这样:

trxnId:某个值, agentId:某个值, agentId: somevalue;

这对吗?

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

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

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

【问题讨论】:

    标签: firebase flutter google-cloud-firestore stream


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 非常感谢。
    猜你喜欢
    • 2021-10-09
    • 2022-01-06
    • 2021-08-27
    • 2021-11-28
    • 2021-07-16
    • 2020-12-14
    • 2021-02-22
    • 2022-11-01
    • 2020-10-18
    相关资源
    最近更新 更多