下面有一个按钮,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
方法运行到最后,并且成功执行,没有问题。
答案 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关键字,这也是因为您可能希望串行运行它。
从方法的结尾而不是开头(将语句分成多行是必需的)。