颤振等待不等待再继续

时间:2020-02-05 21:35:43

标签: flutter dart

下面有一个按钮,onPressed函数调用Future,如下所示。

await styling.dialog(
    context,
    "Update Username",
    "Update",
        () async { // This is the passed onPress method.
      if (formKey.currentState.validate()) {
        final FirebaseUserData firebaseUserData = new FirebaseUserData();
        await firebaseUserData.updateUsername(textController.text); // This is the future<void>
        displayName = textController.text; // This code runs before the above await has finished.
        Navigator.pop(context);
        setState(() {});
      }
    },
);

我不知道为什么会这样。请注意,上面的onPressed函数被传递到另一个类的对话框(我自己的自定义对话框)中,但是setState起作用,所以我想这里没有错。

updateUsername方法如下所示。

Future<void> updateUsername(String username) async {
    return await firestoreUsersCollectionReference
        .getDocuments().then((allUsersDocuments) {
      allUsersDocuments.documents.forEach((userDocument) async {
        if(userDocument.documentID == currentFirebaseUser.displayName) {

          final UserUpdateInfo updateUser = UserUpdateInfo();
          updateUser.displayName = username;
          await currentFirebaseUser.updateProfile(updateUser);
          currentFirebaseUser = await FirebaseAuth.instance.currentUser();


          Map<String, dynamic> newUserData() =>
          {
            describeEnum(fieldNames.itemsCollected): [],
            describeEnum(fieldNames.monstersCollected): [],
            describeEnum(fieldNames.profile): [],
            describeEnum(fieldNames.scannedBarcodes): [],
            describeEnum(fieldNames.settings): [],
            describeEnum(fieldNames.team): [],
          };

          await firestoreUsersCollectionReference.document(username).setData(newUserData());
        }
      });
    });
  }

updateUsername方法运行到最后,并且成功执行,没有问题。

2 个答案:

答案 0 :(得分:1)

您的方法有很多事情要做,但是我怀疑问题是这样的:

listView

您在allUsersDocuments.documents.forEach((userDocument) async { ... }); 中使用了async匿名方法,该方法不尊重返回的期货并等待它们完成。基本上,这只会触发一堆期货(forEach中的每个元素一个),然后返回而看不到它们的作用。

我建议使用普通的documents循环:

for

或使用for (var userDocument in allUserDocuments.documents) { ... }

Future.forEach

答案 1 :(得分:0)

return await firestoreUsersCollectionReference
    .getDocuments().then((allUsersDocuments) 

不应该使用then方法。

您需要做类似

的操作
final allUserDocuments = await firestoreUsersCollectionReference.getDocuments();
 allUsersDocuments.documents.forEach((userDocument {
        if(userDocument.documentID == currentFirebaseUser.displayName)

  }

在每个之后,都没有async关键字,这也是因为您可能希望串行运行它。

从方法的结尾而不是开头(将语句分成多行是必需的)。