Flutter 颤振函数使用Firebase返回空列表
我正在使用FlatterWeb和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
列()
小部件中
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
来处理此过程
见:
返回小部件
运行时,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;
});