Flutter Function returns 使用 Firebase 的空列表
Flutter Function returns empty list using Firebase
我正在使用 Flutter 网络和 firebase 实时数据库。在我的数据库中,我有一些问题,结构为地图,我试图在我的应用程序中显示它们。
对于每个问题,我创建一个小部件,将其添加到列表中,然后将列表附加到 Column()
小部件。
Column()
小部件如下(view_question.dart
文件):
Column(
children: Question().view(),
),
如您所见,我使用了我创建的名为 Question()
.
的 class 中的方法 view()
view()
方法 return 是一个小部件列表。
在我向您展示 .view()
方法之前,我需要提及在 Question
class 之外我已经初始化了以下内容:
List<Widget> widgets = List();
您可以在下面看到 Question
class(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)
。
这是我控制台中的打印输出
据我所知,函数 return 是一个空列表,然后我从数据库中检索数据并将它们添加到列表中。
所以我想问,如何将我的数据添加到列表中,当这个过程完成后,return 列表并将其附加到 Column()
小部件?我应该在 return 语句中添加延迟吗?我错过了什么?
感谢您的宝贵时间
数据从 Firebase 异步加载。当您的 return widgets
运行时,widgets.add(QuestionWidget(values))
尚未被调用。如果您检查应用程序的调试输出,您拥有的 print
语句应该显示这一点。
因此,您应该将 widgets
设置为加载后的状态。然后这将触发 UI 的重绘,它可以从状态中拾取它们。或者,您可以使用 FutureBuilder
来处理此过程。
参见:
// 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;
});
我正在使用 Flutter 网络和 firebase 实时数据库。在我的数据库中,我有一些问题,结构为地图,我试图在我的应用程序中显示它们。
对于每个问题,我创建一个小部件,将其添加到列表中,然后将列表附加到 Column()
小部件。
Column()
小部件如下(view_question.dart
文件):
Column(
children: Question().view(),
),
如您所见,我使用了我创建的名为 Question()
.
view()
view()
方法 return 是一个小部件列表。
在我向您展示 .view()
方法之前,我需要提及在 Question
class 之外我已经初始化了以下内容:
List<Widget> widgets = List();
您可以在下面看到 Question
class(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)
。
这是我控制台中的打印输出
据我所知,函数 return 是一个空列表,然后我从数据库中检索数据并将它们添加到列表中。
所以我想问,如何将我的数据添加到列表中,当这个过程完成后,return 列表并将其附加到 Column()
小部件?我应该在 return 语句中添加延迟吗?我错过了什么?
感谢您的宝贵时间
数据从 Firebase 异步加载。当您的 return widgets
运行时,widgets.add(QuestionWidget(values))
尚未被调用。如果您检查应用程序的调试输出,您拥有的 print
语句应该显示这一点。
因此,您应该将 widgets
设置为加载后的状态。然后这将触发 UI 的重绘,它可以从状态中拾取它们。或者,您可以使用 FutureBuilder
来处理此过程。
参见:
// 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;
});