flutter - 如何在 dart 中等待 Map.forEach()

标签 flutter dictionary dart asynchronous

我有一个返回 map 的 Future。然后,我需要使用该映射的值来等待另一个 future ,然后在最后返回整个结果。问题是 dart 无法等待 async Map.forEach() 方法(请参阅此: https://stackoverflow.com/a/42467822/15782390 )。

这是我的代码:

调试控制台显示打印的项目按以下顺序排列:

flutter: getting journal entries
flutter: about to loop through pictures
flutter: getting picture
flutter: returning entries
flutter: [[....]] (Uint8List)
Future<List<JournalEntryData>> getJournalEntries() async {
    List<JournalEntryData> entries = [];
    print('getting journal entries');

    EncryptService encryptService = EncryptService(uid);

    await journal.get().then((document) {
      Map data = (document.data() as Map);
      print('about to loop through pictures');
      data.forEach((key, value) async {
        print('getting picture');
        dynamic pictures = await StorageService(uid).getPictures(key);
        print('done getting image');
        entries.add(JournalEntryData(
          date: key,
          entryText: encryptService.decrypt(value['entryText']),
          feeling: value['feeling'],
          pictures: pictures,
        ));
      });
    });
    print('returning entries');
    return entries;
  }
  Future getPictures(String entryID) async {
    try {
      final ref = storage.ref(uid).child(entryID);
      List<Uint8List> pictures = [];

      await ref.listAll().then((result) async {
        for (var picReference in result.items) {
          Uint8List? pic = await ref.child(picReference.name).getData();
          if (pic == null) {
            // TODO make no picture found picture
            var url = Uri.parse(
                'https://www.salonlfc.com/wp-content/uploads/2018/01/image-not-found-scaled-1150x647.png');
            var response = await http.get(url);
            pic = response.bodyBytes;
          }
          pictures.add(pic);
        }
      });
      return pictures;
    } catch (e) {
      print(e.toString());
      return e;
    }
  }

最佳答案

当您需要异步行为时,尤其是在 map 上,必须使用 for 循环是非常烦人的,因为正如其他答案所示,这需要您迭代条目,然后获取 keyvalue 像这样:

for (final mapEntry in data.entries) {
    final key = mapEntry.key;
    final value = mapEntry.value;
    ...
}

除此之外,您还可以编写一个实用程序扩展来为您完成工作:

extension AsyncMap<K, V> on Map<K, V> {
  Future<void> forEachAsync(FutureOr<void> Function(K, V) fun) async {
    for (var value in entries) {
      final k = value.key;
      final v = value.value;
      await fun(k, v);
    }
  }
}

然后,您可以像这样使用它:

await data.forEachAsync((key, value) async {
    ...
});

好多了。

关于flutter - 如何在 dart 中等待 Map.forEach(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68248160/

相关文章:

c++ - dart:ffi 的 void 函数

flutter - 如何处理在 flutter 中动态创建的复选框列表?

python - 从另一个字典中提取带有值子集的字典

python - 读取json文件时处理条件语句python中的KeyError

c# - 哈希表/字典冲突

flutter - 用户单击屏幕或打开键盘时如何隐藏状态栏和导航栏?

dart - Flutter:如何获取文本行数

flutter - 使用 flutter_secure_storage 保存数据列表文本......这可能吗?

flutter - 如何最好地让我的滚动 Controller 在整个应用程序中可用?

flutter - 我怎样才能避免 Dart 中这种不必要的转换?