我正在 Flutter 中创建一个表单并想要以下功能:
- 如果用户输入一个 URL,我想用正则表达式确保它是有效的。
- 如果用户将该字段留空,我不想返回错误消息。
当我执行这四个步骤时,以下 Reg Exp 验证器会以这种方式执行:
- 如果我热重载并输入一个有效的 URL,它就会接受它。
- 如果我将输入字段更改为新的无效 URL,它仍然会接受它。
- 如果我热重载并输入无效的 URL,它不接受它。
- 如果我将 URL 更改为有效的 URL,它仍然不接受它。
就好像它只运行验证器一次,然后不再检查任何后续条目。我确实有一个使用 value.isEmpty 作为验证器的字段,并且每次单击带有 _formKey.currentState.save(); 的按钮时检查输入,它确实按预期工作。
child: TextFormField(
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Related URL',
),
textInputAction: TextInputAction.next,
keyboardType: TextInputType.url,
focusNode: _relatedUrlFocusNode,
onFieldSubmitted: (_) {
FocusScope.of(context).requestFocus(_notesFocusNode);
},
//this doesn't work
validator: (String value) {
if (RegExp(r"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")
.hasMatch(value)) {
return 'Please enter a valid URL';
}
return null;
},
onSaved: (String value) {
relatedUrl = value;
},
),
...其他领域...
ElevatedButton(
child: Text('ADD & ACTIVATE'),
onPressed: () {
if (!_formKey.currentState.validate()) {
return;
}
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text('Processing Data')));
_formKey.currentState.save();
},
)
如何确保每次单击提交时它都会执行验证器?