我有一个Futurebuilder,但是它从不返回任何东西。
正如您在下面看到的,我有一个Futurebuilder,它调用一个名为getGamesLost
的方法。如果没有数据,它将显示一个加载指示器。
FirestoreUserProfile firestoreUserProfile = new FirestoreUserProfile();
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: firestoreUserProfile.getGamesLost(),
builder: (BuildContext context, AsyncSnapshot<int> userProfileData) {
if(userProfileData.hasData) {
print(userProfileData);
}
else {
return Styling.loadingIndicator;
}
}
);
我的问题是永远没有数据。下面是getGamesLost方法。
Future<int> getGamesLost() async {
return await firestoreCollectionReference
.document(FirebaseUserData.currentFirebaseUser.email)
.snapshots().forEach((userData) {
return userData.data[describeEnum(fieldNames.profile)][describeEnum(fieldNames.gamesLost)];
});
}
由于某种原因,futurebuilder调用的getGamesLost永远不会完成。我可以在最后一次返回之前打印userData
的值,这意味着实际上有数据从firebase返回,但是好像该方法从未真正返回过,并且futurebuilder一直在等待。
答案 0 :(得分:0)
这是因为您正在使用snapshots()
返回的流来获取数据并对其进行迭代。该流保持活动状态,并侦听任何实时数据更新。这里的forEach
函数会为您提供一个Future
,但是只有在Stream
返回的snapshots()
完成时它才完成。因此,Future
从未完成。
如果您只想从文档中获取值,请像使用它一样。
// The `get` method instead of `snapshots` just fetches the doc at this instance and would not listen for updates
Future<int> getGamesLost() async {
return await firestoreCollectionReference
.document(FirebaseUserData.currentFirebaseUser.email)
.get()
.then((DocumentSnapshot userData) {
return userData.data[describeEnum(fieldNames.profile)]
[describeEnum(fieldNames.gamesLost)];
});
}
希望有帮助!