【发布时间】:2021-01-21 13:59:36
【问题描述】:
我尝试在 Flutter 中实现 Firebase 实时数据库,我想实时显示更新的值。我尝试使用StreamBuilder 来实现这一目标。
StreamBuilder 代码
StreamBuilder(
stream: GuestbooksDatabase().getAllGuestbooksSync().asStream(),
builder: (context, snapshot) {
if (!snapshot.hasData || !snapshot.data.length) {
return CircularProgressIndicator();
} else {
return ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return Text(snapshot.data[index].title);
});
}
}),
流函数
Future<List<Guestbook>> getAllGuestbooksSync() async {
List<Guestbook> guestbooks = [];
databaseRef.onValue.listen((event) async {
var dataSnapshot = event.snapshot;
if (dataSnapshot.value != null) {
dataSnapshot.value.forEach((key, value) async {
Guestbook guestbook = await Guestbook.fromJson(value);
guestbook.setId(key);
guestbooks.add(guestbook);
});
await Future.delayed(Duration.zero);
print(guestbooks); // Result: All Instances of Guestbook
return guestbooks;
}
});
}
我只看到CircularProgressIndicator() 这意味着快照没有数据。
有什么问题?
【问题讨论】:
-
是什么意思!snapshot.data.length
-
快照数据长度时触发
-
您是否已经检查了
snapshot.hasData || !snapshot.data.length中的两个条件中的哪一个是正确的?因为后者意味着读取完成,但是导致没有数据,而前者意味着读取从未完成。另外:您是否检查了应用程序的输出是否有错误/警告? -
如果我在 StreamBuilder 中
print(snapshot.data),结果是null。所以没有数据,!snapshot.hasData条件为真。 -
PS:没有错误,没有警告。从
getAllGuestbooksSync()我得到正确的输出,但StreamBuilder不知道它...:/
标签: flutter dart firebase-realtime-database