我在 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\^\`\~\!\@\#\$\%\&\*\(\)\_\-\+\=\{\}\[\]\|\\\:\;\“"’'\<\,\>\.\?\๐\฿\/]""");
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;
},