在 Flutter 中将 forEach 循环转换为 Future.forEach 循环

Posted

技术标签:

【中文标题】在 Flutter 中将 forEach 循环转换为 Future.forEach 循环【英文标题】:Converting a forEach loop to a Future.forEach loop in Flutter 【发布时间】:2021-02-18 05:10:34 【问题描述】:

我尝试将.forEach 循环转换为Future.forEach 循环以等待循环。我要循环的元素是来自 Firebase 实时数据库的快照。

我的函数如下所示:

Future<User> getUserByUid(String uid) async 
    DataSnapshot dataSnapshot =
        await databaseRef.orderByChild("uid").equalTo(uid).once();

    List user = List();

    dataSnapshot.value.forEach((key, value) async 
      User entry = await User.fromJson(value);
      await entry.setId(key);

      user.add(entry);
    );

    if (user.isNotEmpty) 
      return user[0];
     else 
      return null;
    
  

我尝试了不同的方法,但我无法让该功能正常工作。

第一次尝试:

Future<User> getUserByUid(String uid) async 
    DataSnapshot dataSnapshot =
        await databaseRef.orderByChild("uid").equalTo(uid).once();

    List user = List();

    await Future.forEach(dataSnapshot.value, (element) 
      print(element);
    );

    if (user.isNotEmpty) 
      return user[0];
     else 
      return null;
    
  

错误:

未处理的异常:类型“_InternalLinkedHashMap”不是“Iterable”类型的子类型

第二次尝试:

Future<User> getUserByUid(String uid) async 
    DataSnapshot dataSnapshot =
        await databaseRef.orderByChild("uid").equalTo(uid).once();

    List user = List();

    for (var u in dataSnapshot.value) 
      print(u);
    

    if (user.isNotEmpty) 
      return user[0];
     else 
      return null;
    
  

错误:

未处理的异常:类型“_InternalLinkedHashMap”不是“Iterable”类型的子类型

对于所有尝试,我都会遇到相同的错误。但上面的 .forEach 示例有效。

附加问题:在.forEach 中,我还得到了key 变量。这是否也以某种方式在 Future.forEach 中可用?

【问题讨论】:

它说dataSnapshot.value 不是Itearable,因为它是Map - 如果你想要Iterable 使用Map.key / Map.values / Map.entries 如此简单....它的工作原理。谢谢!是否还有可能获得这些key?密钥保存了 uid,阅读起来很重要.. 抱歉不是Map.key - 当然应该是Map.keys 当然,欢迎您 【参考方案1】:

您正在尝试遍历地图,但(如错误所示)map 不可迭代。不过,您可以遍历地图的键:

for (var key in dataSnapshot.value.keys) 
  print(dataSnapshot.value[key]);

【讨论】:

以上是关于在 Flutter 中将 forEach 循环转换为 Future.forEach 循环的主要内容,如果未能解决你的问题,请参考以下文章

forEach() 循环的 Dart/Flutter 批处理?

尝试在 foreach 循环中将对象附加到 Enumerable

Flutter 慎用的forEach循环

如何在foreach循环中将数组结果组合在php中

如何从 foreach 循环中将双精度值附加到 2D 数组,并访问前一个索引?

在PHP Laravel中将变量从foreach循环传递给我的控制器