我试图找到一种在输入TextFormField.
不久前我找到了一种方法来执行此操作,但现在无论我在 Google 上还是在 StackOverflow 上搜索什么都找不到。
基本上,我希望把从文本框显示的文本000011112222333来0000 1111 2222 3333
我猜我需要RegExp在 a 的onChanged函数中使用一些检查TextFormField并使用它来更改TextEditingController's.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)
);
}
}
Run Code Online (Sandbox Code Playgroud)
然后将其添加到 TextFormField 的 inputFormatters[] 列表中
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
new CustomInputFormatter()
],
Run Code Online (Sandbox Code Playgroud)
小智 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)
| 归档时间: |
|
| 查看次数: |
1419 次 |
| 最近记录: |