如何:在 TextFormField 中键入时每 4 个字符后添加一个空格

Chr*_*ris 2 dart flutter

我试图找到一种在输入TextFormField.

不久前我找到了一种方法来执行此操作,但现在无论我在 Google 上还是在 StackOverflow 上搜索什么都找不到。

基本上,我希望把从文本框显示的文本0000111122223330000 1111 2222 3333

我猜我需要RegExp在 a 的onChanged函数中使用一些检查TextFormField并使用它来更改TextEditingController's.text

Dun*_*Ngo 6

我之前也遇到过这个问题,幸运的是在某处找到了一种方法。首先创建一个扩展 TextInputFormatter 的类

customInputFormatter.dart

class CustomInputFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
    var text = newValue.text;

    if (newValue.selection.baseOffset == 0) {
      return newValue;
    }

    var buffer = new StringBuffer();
    for (int i = 0; i < text.length; i++) {
      buffer.write(text[i]);
      var nonZeroIndex = i + 1;
      if (nonZeroIndex % 4 == 0 && nonZeroIndex != text.length) {
        buffer.write(' '); // Replace this with anything you want to put after each 4 numbers
      }
    }

    var string = buffer.toString();
    return newValue.copyWith(
        text: string,
        selection: new TextSelection.collapsed(offset: string.length)
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

然后将其添加到 TextFormField 的 inputFormatters[] 列表中

inputFormatters: [
   FilteringTextInputFormatter.digitsOnly,
   new CustomInputFormatter()
],   
Run Code Online (Sandbox Code Playgroud)

  • 当我使用此解决方案时,光标正在跳跃并添加不必要的空格 (2认同)

小智 5

灵感来自 Dung Ngo 的代码

我添加了光标跟踪,因此当用户从 TextFormField 中擦除时,光标不会返回到字段的开头。

因为我使用了正则表达式,所以我在笔中评论了 WhitelistingTextInputFormatter.digitsOnly / FilteringTextInputFormatter.digitsOnly 。

这是笔https://codepen.io/brocatz/pen/dyNOqVy

@override
TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
    var text = newValue.text;
    text = text.replaceAll(RegExp(r'(\s)|(\D)'), '');

    int offset = newValue.selection.start;
    var subText =
        newValue.text.substring(0, offset).replaceAll(RegExp(r'(\s)|(\D)'), '');
    int realTrimOffset = subText.length;

    // if (newValue.selection.baseOffset == 0) {
    //   return newValue;
    // }

    var buffer = new StringBuffer();
    for (int i = 0; i < text.length; i++) {
      buffer.write(text[i]);
      var nonZeroIndex = i + 1;
      if (nonZeroIndex % 4 == 0 && nonZeroIndex != text.length) {
        buffer.write(
            ' '); // Replace this with anything you want to put after each 4 numbers
      }


      if (nonZeroIndex % 4 == 0 &&
          subText.length == nonZeroIndex &&
          nonZeroIndex > 4) {
        int moveCursorToRigth = nonZeroIndex ~/ 4 - 1;
        realTrimOffset += moveCursorToRigth;
      }

      if (nonZeroIndex % 4 != 0 && subText.length == nonZeroIndex) {
        int moveCursorToRigth = nonZeroIndex ~/ 4;
        realTrimOffset += moveCursorToRigth;
      }
    }

    var string = buffer.toString();
    return newValue.copyWith(
        text: string,
        selection: new TextSelection.collapsed(offset: realTrimOffset));
  }
Run Code Online (Sandbox Code Playgroud)