TextFormField中的onChanged()的setState()可以是异步的吗?

问题描述 投票:0回答:1

我写了一些代码来检查用户名是否在输入时就已经被选中,我使用了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 asynchronous dart future
1个回答
1
投票

欢迎在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;
    })
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.