我正在尝试在用户注册时检查数据库中是否已存在用户名。因此,我创建了一个检查数据库的函数,并希望它返回布尔值,但是随着对数据库的调用返回了将来,我将该函数设置为异步函数,以便可以等待响应。由于所有异步函数都返回一个future,所以我现在有了future,而不是布尔值。我希望能够在build函数中多次调用函数,但是得到的是Future而不是boolean,如果我尝试添加await,则必须使其异步,这意味着我需要返回Future而不是小部件。
这是小部件。 _account.isUsernameAvailable(value)
是我要返回布尔值的函数,下面是我的构建函数。从我读过的其他答案中,构建未来似乎是一个受欢迎的选择,但是从我的理解中,我们需要事先知道未来的价值。就我而言,这是不可能的。任何建议或帮助将不胜感激。
final _account = Account();
@override
Widget build(BuildContext context) {
return loading ? Loading() : Scaffold(
appBar: AppBar(
title: Text('Sign Up'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Form(
key: _formKey,
child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: TextFormField(
onSaved: (value) {
_username = value.trim();
},
validator: (value) {
if (value.isEmpty) {
return 'Please enter a username';
} else if (_account.isUsernameAvailable(value)) {
return 'Username already exists';
}
return null;
},
decoration: InputDecoration(
hintText: 'Username',
),
),
),
这是帐户类别的代码。
Future isUsernameAvailable(String username) async {
QuerySnapshot docs = await userCollection
.where('username', isEqualTo: username)
.getDocuments();
return docs.documents.isEmpty;
}
更新:
如建议的那样,我在函数中尝试了一个then语句。
bool _userExist = false;
checkUserValue<bool>(String user) {
_account
.isUsernameAvailable(user).then((val){
print(val);
if(val){
print ("UserName Already Exits");
_userExist = val;
}
else{
print ("UserName is Available");
_userExist = val;
}
});
print('here');
return _userExist;
}
我的小部件现在看起来像这样。
child: TextFormField(
onSaved: (value) {
_username = value.trim();
},
validator: (value) {
return checkUserValue(value) ? "Username taken" : null;
},
它似乎可以工作,但是我需要两次验证才能起作用。我认为_userExists
的值可能会在函数以某种方式返回后进行设置,但是我不太确定为什么会发生这种情况。话虽这么说,我确实有一个问题,为什么函数在.then()完成之前不返回?