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

Flutter 如何:在TextFormField中键入时,每4个字符后添加一个空格,flutter,dart,Flutter,Dart,我试图找到一种方法,在键入TextFormField时添加一个空格 不久前我找到了一种方法,但现在我找不到了,无论我在谷歌上搜索什么,还是在StackOverflow上搜索什么 基本上,我想将文本字段中显示的文本从00001111222333转换为0000 1111 2222 3333 我猜我需要使用一些RegExp检查TextFormField的onChanged函数,并使用它来更改TextEditingController。text我以前也遇到过这个问题,幸运的是在某个地方找到了这样做的方法

我试图找到一种方法,在键入
TextFormField
时添加一个空格

不久前我找到了一种方法,但现在我找不到了,无论我在谷歌上搜索什么,还是在StackOverflow上搜索什么

基本上,我想将文本字段中显示的文本从
00001111222333
转换为
0000 1111 2222 3333


我猜我需要使用一些
RegExp
检查
TextFormField
onChanged
函数,并使用它来更改
TextEditingController
。text

我以前也遇到过这个问题,幸运的是在某个地方找到了这样做的方法。 首先创建一个扩展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)
    );
  }
}

我以前也遇到过这个问题,幸运的是在某个地方找到了一个解决这个问题的方法。 首先创建一个扩展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)
    );
  }
}

灵感来自Dung Ngo的代码

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

因为我使用了正则表达式,所以我在笔中对WhiteListingDemiPutFormatter.digitsOnly/FilteringDemiPutFormatter.digitsOnly进行了注释

这是钢笔

@覆盖
TextEditingValue formatEditUpdate(TextEditingValue旧值,TextEditingValue新值){
var text=newValue.text;
text=text.replaceAll(RegExp(r’(\s)|(\D)”),“”);
int offset=newValue.selection.start;
var潜文本=
newValue.text.substring(0,偏移量).replaceAll(RegExp(r'(\s)|(\D')),“”);
int realTrimOffset=subText.length;
//if(newValue.selection.baseOffset==0){
//返回新值;
// }
var buffer=新的StringBuffer();
for(int i=0;i4){
int moveCursorToRigth=非零索引~/4-1;
realTrimOffset+=移动光标长度;
}
if(非零索引%4!=0&&subText.length==非零索引){
int moveCursorToRigth=非零索引~/4;
realTrimOffset+=移动光标长度;
}
}
var string=buffer.toString();
返回newValue.copyWith(
文本:字符串,
选择:新建文本选择。折叠(偏移量:realTrimOffset));
}

灵感来自Dung Ngo的代码

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

因为我使用了正则表达式,所以我在笔中对WhiteListingDemiPutFormatter.digitsOnly/FilteringDemiPutFormatter.digitsOnly进行了注释

这是钢笔

@覆盖
TextEditingValue formatEditUpdate(TextEditingValue旧值,TextEditingValue新值){
var text=newValue.text;
text=text.replaceAll(RegExp(r’(\s)|(\D)”),“”);
int offset=newValue.selection.start;
var潜文本=
newValue.text.substring(0,偏移量).replaceAll(RegExp(r'(\s)|(\D')),“”);
int realTrimOffset=subText.length;
//if(newValue.selection.baseOffset==0){
//返回新值;
// }
var buffer=新的StringBuffer();
for(int i=0;i4){
int moveCursorToRigth=非零索引~/4-1;
realTrimOffset+=移动光标长度;
}
if(非零索引%4!=0&&subText.length==非零索引){
int moveCursorToRigth=非零索引~/4;
realTrimOffset+=移动光标长度;
}
}
var string=buffer.toString();
返回newValue.copyWith(
文本:字符串,
选择:新建文本选择。折叠(偏移量:realTrimOffset));
}

在Flatter 2.2中,你应该使用
过滤灭绝的格式化程序.allow(RegExp(r'[0-9]”)
而不是
过滤灭绝的格式化程序.digitsOnly
在Flatter 2.2中,你应该使用
过滤灭绝的格式化程序.allow(RegExp(r'[0-9]”)
而不是
过滤灭绝的格式化程序.digitsOnly
很好!明天我会检查这个,但是这个看起来和我之前发现的很相似,所以我确信它会工作:DHi mate,我尝试了一下,但是它的格式是这样的“4444 4”。。我似乎也无法创建FilteringTestePutFormatter.DigitOnly。。。这是必要的吗?你能发布你如何实现它的代码吗?FilteringTimePutFormatter.digitsOnly用于确保只能输入数字。这是因为我认为您希望为credit cardI实现此功能。我使用上面的代码创建了一个类,并为我的自定义TextFormField小部件添加了一个参数,该小部件包含一个列表。。。然后,我简单地添加了CustomInputFormatter,就像上面我创建的那样。你可以检查并遵循一个!明天我会检查这个,但是这个看起来和我之前发现的很相似,所以我确信它会工作:DHi mate,我尝试了一下,但是它的格式是这样的“4444 4”。。我似乎也无法创建FilteringTestePutFormatter.DigitOnly。。。这是必要的吗?你能发布你如何实现它的代码吗?FilteringTimePutFormatter.digitsOnly用于确保只能输入数字。这是因为我认为您希望为信用卡汽车实施此功能
@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));
  }