TL; DR maxLength中TextFormField有时允许比指定的限制更多的字符。为什么会发生这种情况?
我正在尝试创建一个Form将用户输入的数据提供给我的应用程序。作为其中的一部分TextFormField,我试图限制使用maxLength.
我的问题是,虽然maxLength大部分工作正常,但似乎可以输入比指定限制更多的字符,特别是在快速输入时(例如快速连续按下数字)。在下面的代码片段中,我设置了maxLength6 个字符,但如果您输入的速度足够快,则可以输入 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);
});
},
),
Run Code Online (Sandbox Code Playgroud)
我也尝试使用以下代码作为 的一部分inputFormatters,但是,它并没有真正做到我想要的。
new LengthLimitingTextInputFormatter(6)
Run Code Online (Sandbox Code Playgroud)
我意识到我也可以添加val.length < 7作为我的验证器功能的一部分,但我试图找到一个不那么挑剔的解决方案。我还想知道发布的这个问题可能有什么其他影响,因为我希望表单验证能让我非常信任输入数据的完整性~100%。
我上面的代码有什么问题导致了这个吗?怎么回事maxLength,为什么在快速输入时可能会超过字符限制?
添加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"');
},
),
),
);
}),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2125 次 |
| 最近记录: |