【问题标题】:Can setState() of onChanged() in TextFormField be asynchronous?TextFormField 中 onChanged() 的 setState() 可以异步吗?
【发布时间】:2020-08-29 16:32:54
【问题描述】:

我编写了一些代码来检查用户名在输入时是否已被使用。 我用过 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】:

    欢迎在 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;
        })
      }
    }
    

    【讨论】:

    • 太棒了!我绝对建议您查看如何在 Flutter 中处理异步编程,因为您需要很多:P
    猜你喜欢
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2020-11-17
    • 2018-09-07
    • 2021-11-13
    相关资源
    最近更新 更多