我使用的是Flatter,我有一个简单的方法,读取数据库中的每个用户,并将其添加到列表中,一旦读取完用户,该方法必须返回包含所有读取数据的列表,我的问题是,我的函数不会等待侦听器完成读取,然后甚至在侦听器完成读取之前返回我的列表(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;

}

我试着在听众面前等待,但什么也没用.

推荐答案

侦听器是等待更改(添加新文档等)并在发生更改时通知您的东西.所以它不是在你调用它之后开始/结束的东西——你通常在你的flatter类的init中创建它,并且它在任何事情发生变化时都会改变状态.

看起来你想要抓取所有用户,once,而不是像你现在这样的listen.

所以与其听,不如读数据.比如:

// 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;

Flutter相关问答推荐

在Flutter 动中绘制ECG图

脚本具有不受支持的MIME类型(';Text/html';).(messaging/failed-service-worker-registration)

与FTPS连接时出现Flutter FTPConnect HandshakeException错误

SingleChildScrollView在ErrorWidget.builder中不工作

Wired Firebase错误-[CLOUD_FIRESTORE/UNAvailable]该服务当前不可用

如何使 dart 函数变得通用?

如何在 Flutter 中创建厚度沿着容器逐渐减小的边框

Flutter - Stripe:类型List 不是类型Map 的子类型? method_channel_stripe.dart 中的错误:263

找不到任何与 com.google.firebase:firebase-sessions:[15.0.0, 16.0.0) 匹配的版本

我无法找到修复此错误的位置,指出无法使用静态访问来访问实例成员

无状态小部件被奇怪地重建

使 Row 中的元素保持在中间的空间,如果它们太大,则将它们包裹起来

如何让小部件根据小部件的大小构建不同的布局?

statefulWidget 无法进行所需更改的问题

扩展磁贴尾随图标在与一个磁贴交互时更新列表中的所有内容.如何只更改展开图块的图标?

无法在Flutter 图像小部件中打开大尺寸(500MB)图像

Future.wait() 中的 futures 可以顺序调用吗?

使用 onPressed 切换到另一个屏幕无法正常工作

在 flutter 中使用 StreamBuilder 在文本字段中键入时显示过滤记录

如何在Flutter 中制作自定义微调器?