android - Flutter验证器仅在双击时触发

标签 android firebase flutter dart widget

我将电话号码存储在Firebase文档(表)中。我想要的是通过使用验证器来检测号码是否已经存在,并在文本框下显示一条消息,说明该电话号码已经存在,我对此没有任何问题,我的问题是必须双击该按钮来执行以完成该操作。任务。

   var _formKey = GlobalKey<FormState>();
   var validate;

   String validateNumber(String value){
      if (value.isEmpty) {
        return 'Please enter number';
      }if(validate == true){
        return "Phone number already exists";
      }
      return null;
    }

   addPhoneNumber(phoneNumber) async{
      var exist = await db.checkPhoneNumber(phoneNumber); //my query to firestore so far i have no problem with this.
      if(exist == true){
         validate = true;
          print(validate);
      }
      if(exist == false){
        validate = false;
        Navigator.of(context).push(_verifyPhone(_phoneNumber.text));
        await db.addPhoneNumber(phoneNumber);
      }
  }                  //my function to detect if the number exists

    @override
  Widget build(BuildContext context) {
    _get1();
    return WillPopScope(
      onWillPop: () async {
        Navigator.pop(context);
        return true;
      },
      child: Scaffold(
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Form(
             key:_formKey,
             child:Expanded(
              child:Scrollbar(
                child: ListView(
                  padding: EdgeInsets.zero,
                  children: <Widget>[
        
                      TextFormField(
                              controller: _phoneNumber,
                              validator: validateNumber,                      //my validator
                    ),
                  ],
                ),
              ),
             ),
            ),
            FlatButton(
                  onTap: (){
                    if(_formKey.currentState.validate()){
                     addPhoneNumber(phoneNumber)
                    }
                  
                  },
                )
          ],
        ),
      ),
    );
  }
}

最佳答案

您需要在表单状态上调用validate()方法。查找here以获取API引用。
框架不会自动为您调用。您需要在按钮的onTap()方法内调用它。在其中添加_formKey.currentState.validate()行。
调用此方法时,表单将为每个表单字段调用validator
---------------------------更新---------------------- -----------------
好吧,@ ppdy,您现在就更近了。尚不可行,因为您的验证程序仅检查该值是否为空。只需仔细查看按下按钮时会发生什么。它运行validateNumber,如果该值为空,则框架将呈现您的验证消息。然后,如果该值不为空,则运行addPhoneNumber方法,但您自己运行它。这很重要,请注意,它不会作为文本表单字段validator属性函数的一部分运行。因此,您需要自行处理await db.checkPhoneNumber(phoneNumber);的输出,如果检查为false,则在文本表单字段中呈现红色验证消息。
为此,请首先注意TextFormField类具有decoration属性。此属性的类型是InputDecoration。请阅读此类here的文档。因此,通过设置装饰的errorText属性,您将能够手动将红色验证消息添加到表单字段。
试着想一想,玩一玩,将其粘在一起,您将拥有想要的东西:)

关于android - Flutter验证器仅在双击时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63013644/

相关文章:

flutter - 在 flutter 中,在 initstate() 之前调用了dependOnInheritedElement()

Android——如何管理多个布局文件才符合DRY原则?

java - 为什么我的 TextView 在每个列表项中的位置不同?

android - 模块根文件夹中缺少文件 google-services.json。没有它,Google Quickstart 插件将无法运行

android - 在 Dispatchers.IO 线程上使用 liveData{} 协程构建器

java - 当我在 firebase 中插入数据时,数据会无限时间提交,直到运行停止-android studio

listview - 对于 Flutter 中的大量对象,我应该使用 Table 还是 ListView?

flutter - flutter升级后找不到一些类

android - Android Kotlin Firebase实时数据库:RecyclerView显示为空

java - 如何从 Radiogroup 获取值(value)并更改数据库