我写了一些代码来检查用户名是否在输入时就已经被选中,我使用了Cloud Firestore。
这是我的TextFormField。
TextFormField(
autovalidate: true,
validator: (val) => val.isEmpty
? 'Username cannot be empty.'
: ((!alphanumeric.hasMatch(val))
? 'Username can have only a-z, A-Z, 0-9 or _'
: null),
onChanged: (text) {
setState(() async {
doesUsernameExist =
await databaseService.checkIfUsernameExists(text);
username = text;
});
},
),
当onChanged()是异步时,验证器不工作。当onChanged()不是异步,并且删除了带有 await的行时,验证器完美工作。
如何使两者同时工作?
欢迎在Flutter中混合Async和非Async :P。
我通常的处理方式是将异步工作划分到另一个方法中,并在某种指示器之间调用该方法,比如加载图标之类的。
onChanged: (text){
// Show Loading Dialog
_setUsername(text);
// Navigator.pop() the loading dialog
}
其中:
_setUsername(String name) async{
bool valid = await databaseService.checkIfUsernameExists(name);
if(valid){
setState((){
username = name;
})
}
}