在 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