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;
    })
  }
}