0

我在 Flutter 中创建了一个启用了 autovalidateMode 的表单。我的应用程序有两个文本字段来输入姓名和年龄。提交这些值时,它们将被插入到配置单元数据库中。启动应用程序时,它将数据库值作为列表加载。当验证我已将 autovalidateMode 设置为 onUserInteraction 的表单,并且在提交时,应用程序将搜索数据库以查看它是否已经插入了名称。如果数据库已经有名称,那么它会给出错误消息“已经有名称”。我的提交按钮 onpressed 有 _formKey.currentState.validate()。当我点击提交按钮验证器必须只运行一次,但它运行两次。因为如果我给出一个已经在数据库中的名称,错误消息不会显示.如果我禁用自动验证模式,那么它会正常工作。为什么?

功能和属性:-

  final _formKey = GlobalKey<FormState>();
  final fieldText_name = TextEditingController();
  final fieldText_age = TextEditingController();
  bool search = false;
  String _name;
  String _age;
  //clear the text after submit
  void clearText() {
    fieldText_name.clear();
    fieldText_age.clear();
  }
  //add name and age to database
  addContact(Contact contact) async {
    await Hive.box('contact').add(contact);
  }
 //search the name with database to see if it already has that name
  searchContact(name) async {
    print("searchContact stated :$search");
    var length = Hive.box('contact').length;
    for (int num = 0; num < length; num++) {
      if (name == await Hive.box('contact').getAt(num).name) {
          search = true;
          break;
      }
    }
  }

按钮代码:-

child: TextButton(
              child: Text("Submit"),
              onPressed: () async {
                await _formKey.currentState?.save();
                await searchContact(_name);
                print("Afte searchContact: $search");
               if (await _formKey.currentState.validate()) {
                  final newContact = Contact(_name, int.parse(_age));
                  if (!search) {
                    addContact(newContact);
                  };
                  clearText();
                }
              }),

表格内:-

                TextFormField(

                  controller: fieldText_name,
                  validator: (value1) {
                    RegExp exp1 = RegExp(
                        r"""[0-9\^\`\~\!\@\#\$\%\&\*\(\)\_\-\+\=\{\}\[\]\|\\\:\;\“&quot;’'\<\,\>\.\?\๐\฿\/]""");
                    if (value1 == null || value1.isEmpty) {
                      return 'Empty';
                    } else if (exp1.hasMatch(value1)) {
                      return 'Letters only';
                    } else {
                      print("validation :$search");
                      if (search) {
                        search = false;
                        print("validation inside if :$search");
                        return 'Already has the name';
                      }
                    }
                    return null;
                  },
4

0 回答 0