Flutter在继续之前未等待

问题描述 投票:0回答:1

我有一个按钮,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方法运行到最后,并且成功成功,没有问题。

flutter dart
1个回答
0
投票
return await firestoreUsersCollectionReference
    .getDocuments().then((allUsersDocuments) 

then方法不应使用。

您需要做类似的事情

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

  }

每个之后,都没有async关键字,因为您可能想串行运行它。

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

© www.soinside.com 2019 - 2024. All rights reserved.