Flutter Futurebuilder不返回任何内容

时间:2020-01-31 18:00:27

标签: asynchronous flutter dart promise

我有一个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一直在等待。

1 个答案:

答案 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)];
  });
}

希望有帮助!