我使用的是颤振,我有一个简单的方法,它读取数据库中的每个用户并将它们添加到列表中,一旦读取完用户,该方法必须返回包含所读取的所有数据的列表,我的问题是,我的函数不会等待侦听器完成读取,然后在侦听器完成读取之前返回我的列表(myList)。如何等待返回的myList,直到侦听器读取了所有元素?
下面是代码:
Future<List<String>> getUsers () async {
List<String> myList = [];
final mRef = FirebaseDatabase.instance.ref().child("Users");
mRef.onValue.listen((event) async {
for (final child in event.snapshot.children) {
myList.add( child.value.toString() ); //ADDS THE VALUE TO THE LIST
}
});
//RETURN THE LIST
return myList;
}我试着在听者面前等待,但什么也没成功。
发布于 2022-04-06 10:48:13
侦听器是等待更改的东西(添加了新文档等)。一旦发生这种情况就会通知你。所以它不是在您调用它之后开始/结束的东西--您通常在颤振类的init中创建它,并且每当发生更改时它都会改变状态。
看起来你只想抓住所有的用户一次,而不是像你正在做的那样听。
所以,也许只是阅读数据,而不是倾听。类似于:
// fetch all the documents
final allDocs =
await FirebaseFirestore.instance.collection('users').get();
// map them to something like your strings.
final thedetails = allDocs.docs.map((DocumentSnapshot e) => e.data()!.toString()).toList();
return thedetails;发布于 2022-04-06 10:57:42
学习和理解Firebase如何使用flutter的一个非常好的方法是FlutterFire,因为您正在处理未来的结果--首先应该使用任何状态管理来控制它是否完成,然后考虑返回一个承诺以及您管理的方式是不同的。如FlutterFire云修复文档所述,这是未来使用的示例
class GetUserName extends StatelessWidget {
final String documentId;
GetUserName(this.documentId);
@override
Widget build(BuildContext context) {
CollectionReference users = FirebaseFirestore.instance.collection('users');
return FutureBuilder<DocumentSnapshot>(
future: users.doc(documentId).get(),
builder:
(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasError) {
return Text("Something went wrong");
}
if (snapshot.hasData && !snapshot.data!.exists) {
return Text("Document does not exist");
}
if (snapshot.connectionState == ConnectionState.done) {
Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>;
return Text("Full Name: ${data['full_name']} ${data['last_name']}");
}
return Text("loading");
},
);
}
}但是,如果您只需要以同步方式加载一次,那么来自乔恩·蒙霍伊的答案是正确的。
https://stackoverflow.com/questions/71764640
复制相似问题