仅允许 TextFormField 中的特定输入,而无需在 Flutter 中进行验证
Allow only specific input in TextFormField without validation in Flutter
我想允许用户在 1 到 10.000 之间最多输入 5 个数字,但是这个 TextFormField
不是必需的,不应通过 Form
验证提交,但我想让用户知道他是否要添加此字段,他不能超过 10.000,并且他必须只输入 1 到 10.000 之间的数字。 TextFormField
:
的代码
TextFormField(
keyboardType: TextInputType.number,
controller: _number,
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.digitsOnly //I have set this so the input is only numbers/digits
],
decoration: kTextFieldDecoration.copyWith(
hintText: 'Enter number between 1 and 10.000',
labelText: 'Number from 1 to 10.000',
),
),
我不确定如何实现这一点,我对其余字段使用了正则表达式验证,但由于该字段不是必需的,我无法通过 Form
验证来验证它。感谢任何形式的帮助。提前致谢!
可以试试下面的代码,供大家参考
更新版本 1
class NumericalRangeFormatter extends TextInputFormatter {
final double min;
final double max;
NumericalRangeFormatter({required this.min, required this.max});
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue,
TextEditingValue newValue,
) {
if (newValue.text == '') {
return newValue;
} else if (int.parse(newValue.text) < min) {
return TextEditingValue().copyWith(text: min.toStringAsFixed(5));
} else {
return int.parse(newValue.text) > max ? oldValue : newValue;
}
}
}
keyboardType: TextInputType.numberWithOptions(),
inputFormatters: [
LengthLimitingTextInputFormatter(5) // only allow 5 digit number
],
请尝试下面的正则表达式
它只允许 1 到 10,000 之间的数字,您可以使用 TextFormFieldmaxLength 属性 限制输入
int validateNumber(String numberVal) {
String patttern = r'^[1-9]([0-9]{0,1})([.][0-9]{1,3})?$';
RegExp regExp = new RegExp(patttern);
if (numberVal.isEmpty || numberVal.length == 0) {
return 1;
} else if (!regExp.hasMatch(numberVal)) {
return 2;
} else {
return 0;
}
}
TextFormField(
autovalidateMode: AutovalidateMode.onUserInteraction,
/* autovalidate is disabled */
controller: numController,
keyboardType: TextInputType.numberWithOptions(
decimal: true,
),
maxLength: 6,
onChanged: (val) {},
maxLines: 1,
validator: (value) {
int res = validateNumber(value);
if (res == 1) {
return "Please fill this required field";
} else if (res == 2) {
return "Please enter valid number between 1 to 10.000";
} else {
return null;
}
},
focusNode: numFocus,
autofocus: false,
decoration: InputDecoration(
errorMaxLines: 3,
counterText: "",
filled: true,
fillColor: Colors.white,
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Color(0xffE5E5E5),
),
),
disabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Color(0xffE5E5E5),
),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Color(0xffE5E5E5),
),
),
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Colors.red,
)),
focusedErrorBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Colors.red,
),
),
hintText: "Enter number between 1 to 10.000" ?? "",
),
),
您可以通过这种方式对非必填字段使用验证器:
validator: (value) {
if (value == null || value.isEmpty) {
return null;
}else {
double? num = double.tryParse(value);
if(num == null)
return 'Invalid value';
else if(num < 1 || num > 10)
return 'Please enter value between 1 and 10.000';
}
return null;
},
因此,通过这种方式,如果值为 null 或空,则我们可以跳过检查,否则执行所需的检查。
我想允许用户在 1 到 10.000 之间最多输入 5 个数字,但是这个 TextFormField
不是必需的,不应通过 Form
验证提交,但我想让用户知道他是否要添加此字段,他不能超过 10.000,并且他必须只输入 1 到 10.000 之间的数字。 TextFormField
:
TextFormField(
keyboardType: TextInputType.number,
controller: _number,
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.digitsOnly //I have set this so the input is only numbers/digits
],
decoration: kTextFieldDecoration.copyWith(
hintText: 'Enter number between 1 and 10.000',
labelText: 'Number from 1 to 10.000',
),
),
我不确定如何实现这一点,我对其余字段使用了正则表达式验证,但由于该字段不是必需的,我无法通过 Form
验证来验证它。感谢任何形式的帮助。提前致谢!
可以试试下面的代码,供大家参考
更新版本 1
class NumericalRangeFormatter extends TextInputFormatter {
final double min;
final double max;
NumericalRangeFormatter({required this.min, required this.max});
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue,
TextEditingValue newValue,
) {
if (newValue.text == '') {
return newValue;
} else if (int.parse(newValue.text) < min) {
return TextEditingValue().copyWith(text: min.toStringAsFixed(5));
} else {
return int.parse(newValue.text) > max ? oldValue : newValue;
}
}
}
keyboardType: TextInputType.numberWithOptions(),
inputFormatters: [
LengthLimitingTextInputFormatter(5) // only allow 5 digit number
],
请尝试下面的正则表达式
它只允许 1 到 10,000 之间的数字,您可以使用 TextFormFieldmaxLength 属性 限制输入
int validateNumber(String numberVal) {
String patttern = r'^[1-9]([0-9]{0,1})([.][0-9]{1,3})?$';
RegExp regExp = new RegExp(patttern);
if (numberVal.isEmpty || numberVal.length == 0) {
return 1;
} else if (!regExp.hasMatch(numberVal)) {
return 2;
} else {
return 0;
}
}
TextFormField(
autovalidateMode: AutovalidateMode.onUserInteraction,
/* autovalidate is disabled */
controller: numController,
keyboardType: TextInputType.numberWithOptions(
decimal: true,
),
maxLength: 6,
onChanged: (val) {},
maxLines: 1,
validator: (value) {
int res = validateNumber(value);
if (res == 1) {
return "Please fill this required field";
} else if (res == 2) {
return "Please enter valid number between 1 to 10.000";
} else {
return null;
}
},
focusNode: numFocus,
autofocus: false,
decoration: InputDecoration(
errorMaxLines: 3,
counterText: "",
filled: true,
fillColor: Colors.white,
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Color(0xffE5E5E5),
),
),
disabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Color(0xffE5E5E5),
),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Color(0xffE5E5E5),
),
),
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Colors.red,
)),
focusedErrorBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(4)),
borderSide: BorderSide(
width: 1,
color: Colors.red,
),
),
hintText: "Enter number between 1 to 10.000" ?? "",
),
),
您可以通过这种方式对非必填字段使用验证器:
validator: (value) {
if (value == null || value.isEmpty) {
return null;
}else {
double? num = double.tryParse(value);
if(num == null)
return 'Invalid value';
else if(num < 1 || num > 10)
return 'Please enter value between 1 and 10.000';
}
return null;
},
因此,通过这种方式,如果值为 null 或空,则我们可以跳过检查,否则执行所需的检查。