maxLength
中的 TL; DR TextFormField
有时允许的字符数超过指定的限制。为什么会这样?
我正在尝试创建一个Form
来将用户输入的数据输入到我的应用程序中。为此,我有一个TextFormField
,试图限制使用maxLength
输入的最大字符数。
我的问题是,虽然maxLength
可以正常工作,但是似乎可以输入比指定限制更多的字符,尤其是在快速输入(例如快速连续按下数字)时。
在下面的代码段中,我将maxLength
设置为6个字符,但是如果键入速度足够快,则可以输入7个字符。 即最多可以输入 999,999 ,但是可以输入 9,999,999 。
我的代码段
TextFormField(// text form field for inputting a number
validator: (val) => val.isEmpty ? 'Please enter a target to save' : null,
// Using inputFormatters to only accept digits as inputs
inputFormatters: <TextInputFormatter>[WhitelistingTextInputFormatter.digitsOnly,],
keyboardType: TextInputType.number,
// When I specify a maxLength of 6, it can still receive up to 7 digits if entered quickly
maxLength: 6,
onChanged: (val) {
setState(() {
_new_number_to_input = int.parse(val);
});
},
),
我还尝试将以下代码用作inputFormatters
的一部分,但是,它并没有真正实现我想要的功能。
new LengthLimitingTextInputFormatter(6)
我意识到我也可以在验证器功能中添加val.length < 7
,但是我正在尝试找到一个不太复杂的解决方案。我还想知道此问题发布还会带来什么其他影响,因为我希望通过表单验证使我几乎可以相信输入数据的完整性〜100%。
上面的代码是否有问题,导致这种情况? maxLength
发生了什么,为什么在快速键入时可以超过字符数限制?
答案 0 :(得分:0)
将maxLengthEnforced: true,
和TextFormField
一起添加到maxLength: 6,
。
小例子:
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Form(
autovalidate: true,
onChanged: () {
Form.of(primaryFocus.context).save();
},
child: Wrap(
children: List<Widget>.generate(5, (int index) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: ConstrainedBox(
constraints: BoxConstraints.tight(Size(200, 50)),
child: TextFormField(
maxLength: 6,
maxLengthEnforced: true,
onSaved: (String value) {
print('Value for field $index saved as "$value"');
},
),
),
);
}),
),
);
}
}
答案 1 :(得分:0)
您还可以添加一个 inputformatter,指定文本字段的最大字符限制
TextField(
...
...
maxLength: <must be greater than 0>,
inputFormatters: [
LengthLimitingTextInputFormatter(6),
],
);
输入格式化程序要求您导入服务
import 'package:flutter/services.dart';
[maxLength] 不得为 null 或 -1,如果为 null 或 -1,则不强制执行任何限制。