TextFormField中的onChanged()的setState()可以异步吗?
Can setState() of onChanged() in TextFormField be asynchronous?
我写了一些代码来检查输入的用户名是否已被占用。
我用过 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 中混合异步和非异步 :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;
})
}
}
我写了一些代码来检查输入的用户名是否已被占用。 我用过 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 中混合异步和非异步 :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;
})
}
}