Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振函数使用Firebase返回空列表_Flutter_Dart_Firebase Realtime Database_Flutter Web - Fatal编程技术网

Flutter 颤振函数使用Firebase返回空列表

Flutter 颤振函数使用Firebase返回空列表,flutter,dart,firebase-realtime-database,flutter-web,Flutter,Dart,Firebase Realtime Database,Flutter Web,我正在使用FlatterWeb和firebase实时数据库。在我的数据库中,我有一些问题,结构如地图,我正试图在我的应用程序中显示它们 对于每个问题,我创建一个小部件,将其添加到列表中,然后将列表附加到列()小部件中 Column()小部件如下(view\u question.dart文件): 如您所见,我使用了我创建的名为Question()的类中的view()方法 view()方法返回小部件列表 在我向您展示.view()方法之前,我需要指出,在问题类之外,我已经初始化了以下内容: List

我正在使用FlatterWeb和firebase实时数据库。在我的数据库中,我有一些问题,结构如地图,我正试图在我的应用程序中显示它们

对于每个问题,我创建一个小部件,将其添加到列表中,然后将列表附加到
列()
小部件中

Column()
小部件如下(
view\u question.dart
文件):

如您所见,我使用了我创建的名为
Question()
的类中的
view()
方法

view()
方法返回小部件列表

在我向您展示
.view()
方法之前,我需要指出,在
问题
类之外,我已经初始化了以下内容:

List<Widget> widgets = List();
我从数据库中获取问题数据,然后为每个问题创建一个
QuestionWidget()
小部件,在其中传递相应的数据,并将其添加到
widgets
列表中。之后,我将
print()
查看
widgets
列表,以便监控整个过程

您也可以看到,我在
return
语句之前添加了一个
print(widgets)

这是我控制台中的打印输出

由此,我了解到函数返回一个空列表,然后我从数据库中检索数据并将其添加到列表中

所以我在问,如何将数据添加到列表中,当这个过程完成后,返回列表并将其附加到
列()
小部件中?我应该在返回语句中添加延迟吗?我错过了什么


感谢您抽出时间

从Firebase异步加载数据。当您的
返回小部件
运行时,
widgets.add(QuestionWidget(values))
尚未被调用。如果您检查应用程序的调试输出,您的
print
语句应该会显示这一点

因此,您应该在加载小部件后将其设置为状态。这将触发UI的重新绘制,从而可以从状态中提取它们。或者,您可以使用
FutureBuilder
来处理此过程

见:


数据从Firebase异步加载。当您的
返回小部件
运行时,
widgets.add(QuestionWidget(values))
尚未被调用。如果您检查应用程序的调试输出,您的
print
语句应该会显示这一点

因此,您应该在加载小部件后将其设置为状态。这将触发UI的重新绘制,从而可以从状态中提取它们。或者,您可以使用
FutureBuilder
来处理此过程

见:

//返回类型如下
未来视图(){
数据库db=数据库();
DatabaseReference=db.ref('questions/');
//还这个
返回ref.orderByKey()。一次(“值”)。然后((e){
DataSnapshot DataSnapshot=e.snapshot;
datasnapshot.val().forEach((键,值){
添加(QuestionWidget(值));
});
//添加所有值后返回小部件
返回窗口小部件;
});
//返回类型如下
未来视图(){
数据库db=数据库();
DatabaseReference=db.ref('questions/');
//还这个
返回ref.orderByKey()。一次(“值”)。然后((e){
DataSnapshot DataSnapshot=e.snapshot;
datasnapshot.val().forEach((键,值){
添加(QuestionWidget(值));
});
//添加所有值后返回小部件
返回窗口小部件;
});

这不是一个异步函数吗?顺便说一句,我使用了你的答案并帮助我正确设置了.view()方法。我将你的
Future view()
替换为
Future view()async
。谢谢!这不是一个异步函数吗?顺便说一句,我使用了你的答案并帮助我设置了.view()方法正确。我将您的
Future view()
替换为
Future view()async
。谢谢!谢谢!您评论中的第一个链接和Rajitha的答案(这里的第二个答案)使我正确返回了列表。谢谢!您评论中的第一个链接和Rajitha的答案(这里的第二个答案)使我正确地返回了列表。
List<Widget> widgets = List();
List<Widget> view() {
    
    Database db = database();
    DatabaseReference ref = db.ref('questions/');

    ref.orderByKey().once("value").then((e) {
      DataSnapshot datasnapshot = e.snapshot;
      datasnapshot.val().forEach((key, values) {
        
        widgets.add(QuestionWidget(values));
        print(widgets);
        
      });
    });
    print(widgets);
    return widgets;
    // return type is like this
    Future<List<Widget>> view() {
    
    Database db = database();
    DatabaseReference ref = db.ref('questions/');

    // return this
    return ref.orderByKey().once("value").then((e) {
      DataSnapshot datasnapshot = e.snapshot;

      datasnapshot.val().forEach((key, values) {
        widgets.add(QuestionWidget(values));
      });
      
      // return widgets after added all values
      return widgets;
    });