为什么不运行等待


print(2);
print(_emailTaken);
print(2);
await isRegister(emailController.value.text);
print(3);
print(_emailTaken);
print(3);

和我的isRegister方法

Future<void> isRegister(String email) async {
fireStore.collection('Users').doc(email).get().then((DocumentSnapshot ds) {
print(1);
print(ds.exists);
print(1);
_emailTaken = ds.exists;
});
}

但是输出是

I/flutter(20531(:2

I/flutter(20531(:错误

I/flutter(20531(:2

I/flutter(20531(:3

I/flutter(20531(:错误

I/flutter(20531(:3

I/flutter(20531(:1

I/flutter(20531(:真正的

I/flutter(20531(:1

为什么不在等待语法中等待?

您不是在等待进入您的注册函数。因此,要修复它,请将其更改为以下内容:

Future<void> isRegister(String email) async {
await  fireStore.collection('Users').doc(email).get().then((DocumentSnapshot ds) {
print(1);
print(ds.exists);
print(1);
_emailTaken = ds.exists;
});
}

或者:

Future<void> isRegister(String email) {
return fireStore.collection('Users').doc(email).get().then((DocumentSnapshot ds) {
print(1);
print(ds.exists);
print(1);
_emailTaken = ds.exists;
});
}

您也可以返回Future:,而不是Kishan建议的isRegister中的awaiting

Future<bool> isRegister(String email) {
return fireStore
.collection('Users')
.doc(email)
.get()
.then((DocumentSnapshot ds) => _emailTaken = ds.exists);
}

注意:一个额外的好处是isRegister的返回现在是Future<bool>。结果仍然缓存在_emailTaken中以供将来参考,但也由您的方法直接返回

return的最小工作示例:

bool x = false;
Future<bool> _fetchData() {
return Future.delayed(Duration(seconds: 1)).then((_) => x = true);
}
Future<void> main() async {
print('1. $x');
print('2. ${await(_fetchData())}');
print('3. $x');
await Future.delayed(Duration(seconds: 1));
print('4. $x');
}

结果:

1. false
2. true
3. true
4. true

不带return的最小工作示例:

bool x = false;
Future<void> _fetchData() async {
Future.delayed(Duration(seconds: 1)).then((_) => x = true);
}
Future<void> main() async {
print('1. $x');
await(_fetchData());
print('3. $x');
await Future.delayed(Duration(seconds: 1));
print('4. $x');
}

结果:

1. false
3. false
4. true

最新更新