我有一个按钮,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
方法运行到最后,并且成功成功,没有问题。
return await firestoreUsersCollectionReference
.getDocuments().then((allUsersDocuments)
then
方法不应使用。
您需要做类似的事情
final allUserDocuments = await firestoreUsersCollectionReference.getDocuments();
allUsersDocuments.documents.forEach((userDocument {
if(userDocument.documentID == currentFirebaseUser.displayName)
}
每个之后,都没有async关键字,因为您可能想串行运行它。
从方法的结尾返回,而不是从开头(将语句分成多行是必需的。