TextFormField字符限制不起作用

时间:2020-07-08 05:39:55

标签: flutter dart

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发生了什么,为什么在快速键入时可以超过字符数限制?

2 个答案:

答案 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"');
                },
              ),
            ),
          );
        }),
      ),
    );
  }
}

引用自TextFormField Docs

答案 1 :(得分:0)

您还可以添加一个 inputformatter,指定文本字段的最大字符限制

TextField(
...
...
maxLength: <must be greater than 0>,
 inputFormatters: [
                    LengthLimitingTextInputFormatter(6),
                  ],
    );

输入格式化程序要求您导入服务

import 'package:flutter/services.dart';

[maxLength] 不得为 null 或 -1,如果为 null 或 -1,则不强制执行任何限制。