首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >怎样才能等到Firebase数据库数据被检索出来时呢?

怎样才能等到Firebase数据库数据被检索出来时呢?
EN

Stack Overflow用户
提问于 2022-04-06 09:56:11
回答 2查看 959关注 0票数 3

我使用的是颤振,我有一个简单的方法,它读取数据库中的每个用户并将它们添加到列表中,一旦读取完用户,该方法必须返回包含所读取的所有数据的列表,我的问题是,我的函数不会等待侦听器完成读取,然后在侦听器完成读取之前返回我的列表(myList)。如何等待返回的myList,直到侦听器读取了所有元素?

下面是代码:

代码语言:javascript
复制
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;

}

我试着在听者面前等待,但什么也没成功。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-06 10:48:13

侦听器是等待更改的东西(添加了新文档等)。一旦发生这种情况就会通知你。所以它不是在您调用它之后开始/结束的东西--您通常在颤振类的init中创建它,并且每当发生更改时它都会改变状态。

看起来你只想抓住所有的用户一次,而不是像你正在做的那样听。

所以,也许只是阅读数据,而不是倾听。类似于:

代码语言:javascript
复制
// 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;
票数 1
EN

Stack Overflow用户

发布于 2022-04-06 10:57:42

学习和理解Firebase如何使用flutter的一个非常好的方法是FlutterFire,因为您正在处理未来的结果--首先应该使用任何状态管理来控制它是否完成,然后考虑返回一个承诺以及您管理的方式是不同的。如FlutterFire云修复文档所述,这是未来使用的示例

代码语言:javascript
复制
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");
      },
    );
  }
}

但是,如果您只需要以同步方式加载一次,那么来自乔恩·蒙霍伊的答案是正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71764640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档