【发布时间】: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 -
当然,欢迎您
标签: flutter dart firebase-realtime-database