首页 > 解决方案 > Flutter:如何遍历“DocumentSnapshot.data()”中的每个字段

问题描述

我有一个集合,每个用户都有自己的文档。在文档中,我为新条目创建了一个地图。该文档看起来像这样: 样本文件

在我的应用程序中,我想获取文档,然后将其变成一个列表,其中每个地图(按时间命名)都是一个条目。我尝试循环遍历它,但问题是其中没有 forEach()DocumentSnapshot.data()并且它是_JsonDocumentSnapshot.

我怎样才能把它作为一个列表来获得,其中2021-05-30 20:49:59.671705, 2021-05-30 20:50:00:600294, ... 是列表中的单个元素。我计划使用诸如 a 之类的东西自己构建每个条目,ListView.builder()所以我想列出所有这些条目。

编辑:我的代码看起来像这样:

journal只是一个DocumentReference

journal.snapshots().forEach((element) {
      var data = element.data();
      print(element.data());

      (data ?? {}).forEach((key, value) {
        return JournalEntryData(
            date: key,
            entryText: value['entryText'],
            feeling: value['feeling']);
      });
    });

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


问题是data设置为element.data()的类型Object?因此forEach()没有定义方法。我尝试将导致错误的 as 转换element.data()为 a List,所以我没有走得更远。我应该做的是将其转换element.data()Map有效的。我也应该使用journal.get()而不是snapshots()因为它是一个流,所以await关键字会导致journal.snapshots().forEach()永远不会结束。

最终代码看起来像这样:

Future<List<JournalEntryData>> getJournalEntries() async {
  List<JournalEntryData> entries = [];

  await journal.get().then((document) {
    Map data = (document.data() as Map);
    data.forEach((key, value) {
      print('adding entry');
      entries.add(JournalEntryData(
        date: key,
        entryText: value['entryText'],
        feeling: value['feeling'],
      ));
    });
  });

  return entries;
}

我会执行以下操作来获取条目:

var entries = await getJournalEntries();

推荐阅读