在我的代码我验证电话号码。如果电话号码是不正确的-我显示错误消息。但是,当用户开始编辑号码,我想隐藏这个错误消息。
我已经找到了currentState.reset()
的解决方案,但它似乎不是一个好的。我必须处理保存文本和光标位置的问题。我仍然有一个小工件。通常当我按下并按住backspace -它会一个接一个地删除符号。如果我这样做时,错误消息显示-然后错误消息消失,只有一个符号被删除。
有人知道这个案子的正确解决方案吗?
final TextEditingController controller = TextEditingController();
final RegExp _phoneRegex = RegExp(r"^\+{1}\d{10, 15}\$");
bool isError = false;
TextSelection currentPosition;
return Column(
children: <Widget>[
Form(
key: _textKey,
child: TextFormField(
controller: controller,
validator: (str) {
isError = true;
if (str.isEmpty) {
return err_empty_field;
} else if (!_phoneRegex.hasMatch(str)) {
return err_invalid_phone;
}
isError = false;
},
),
onChanged: () {
if (controller.selection.start < 0 &&
controller.text.length > 0) {
TextSelection position =
controller.text.length > currentPosition.start
? currentPosition
: TextSelection.fromPosition(
TextPosition(offset: controller.text.length));
controller.selection = position;
}
if (isError) {
isError = false;
currentPosition = controller.selection;
if (currentPosition.start > controller.text.length) {
currentPosition = TextSelection.fromPosition(
TextPosition(offset: controller.text.length));
}
String currentText = controller.text;
_textKey.currentState.reset();
controller.text = currentText;
controller.selection = currentPosition;
}
},
),
RaisedButton(
onPressed: () {
_textKey.currentState.validate();
},
child: Text(login),
)
],
);
9条答案
按热度按时间bqjvbblv1#
编辑(2020年11月)
autovalidate
在v1.19.0之后已弃用。请改用
autovalidateMode
:原始帖子
这里有一个解决这个问题合适方案。
实际上,您不需要使用
onChanged
或任何引起副作用的提示,我通过创建一个初始化为false
的类属性来解决这个问题:表单小部件有一个命名属性
autovalidate
。您应该向其传递前面的布尔值:在Submit按钮
onPressed()
方法中,如果表单是invalid
,则应该将_autovalidate
布尔值更新为true
,这将使表单在每次onChanged
调用时自动验证TextFormField:希望能帮到什么人。
vfhzx4xs2#
2021年1月
jvlzgdj93#
这里的问题是
errorText
是由TextFormField
的validator
字段自动管理的,同时,简单的解决方案是手动处理errorText
。_errorText
初始化为null
。该字段将保存需要显示的错误消息。_error
初始化为false
。如果有错误,则字段为true
,否则为false
。_errorText
分配给TextFormField
TextFormField
validator
返回一个null
值。_errorText
。_error
状态。_errorText
和_error
。这将在您开始编辑时从字段中删 debugging 误。onFieldSubmitted
中的字段验证并管理您的代码流...vfhzx4xs4#
我已实现您的以下两项功能:
1)编辑时隐藏错误消息
2)按下登录按钮时验证输入字段
注:我已经注解了电话号码正则表达式,并将验证字符串长度〈10位进行测试。
wkftcu5l5#
我找到了一个更简单的方法
mutmk8jj6#
这是一个例子,我认为它没有必要做onchange(),函数validate name做的工作...
ruarlubt7#
我发现使用
FocusNode
和AtuoValidateMode.onUserInteraction
的组合可以达到目的。zkure5ic8#
kgsdhlau9#
这个格式对我很有效,希望对别人有帮助。