Flutter 函数使用 Firebase 返回空列表

Posted

技术标签:

【中文标题】Flutter 函数使用 Firebase 返回空列表【英文标题】:Flutter Function returns empty list using Firebase 【发布时间】:2021-03-10 23:52:01 【问题描述】:

我正在使用 Flutter web 和 firebase 实时数据库。在我的数据库中,我有一些问题,结构为地图,我正在尝试在我的应用中显示它们。

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

Column() 小部件如下(view_question.dart 文件):

Column(
  children: Question().view(),
),

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

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

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

List<Widget> widgets = List();

您可以在下面看到Question 类(Question.dart 文件)中的.view() 方法:

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;

我从我的数据库中获取我的问题数据,然后为每个问题创建一个QuestionWidget() 小部件,我在其中传递相应的数据并将其添加到widgets 列表中。然后我print()widgets列表,这样我就可以全程监控了。

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

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

据我所知,该函数返回一个空列表,然后我从数据库中检索我的数据并将它们添加到列表中。

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

感谢您的宝贵时间

【问题讨论】:

【参考方案1】:

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

因此,您应该将 widgets 设置为加载后的状态。然后,这将触发 UI 的重绘,这可以从状态中获取它们。或者,您可以使用FutureBuilder 来处理此过程。

见:

How can I put retrieved data from firebase to a widget in Flutter? Slow data loading from firebase causing "RangeError (index)"

【讨论】:

谢谢!您评论中的第一个链接和 Rajitha 的答案(此处的第二个答案)使我正确返回了列表。【参考方案2】:
    // 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;
    );
    

【讨论】:

这不应该是一个异步函数吗?顺便说一句,我使用了您的答案并帮助我正确设置了 .view() 方法。我用Future&lt;List&gt; view() async 替换了你的Future&lt;List&lt;Widget&gt;&gt; view() 。谢谢!

以上是关于Flutter 函数使用 Firebase 返回空列表的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 使用提供者和 Firestore 返回空列表

Flutter webapp:Snapshort返回一个空值

将 Firebase 数据库数组返回到另一个函数但返回空

Firebase 云函数在 Flutter 中返回 null,因为它仍在运行

从 iOS 应用程序调用时,Firebase 函数返回空值

Flutter Future:构建函数返回 null