customPatternFormatter static method
customPatternFormatter formats input based on a custom pattern. Example pattern: "XXX-XXX-XXXX" where 'X' is a placeholder for user input.
Implementation
static List<TextInputFormatter> customPatternFormatter(String pattern,
{String placeholder = 'X'}) {
final List<TextInputFormatter> formatters = [];
String formattedPattern = '';
int placeholderCount = 0;
for (int i = 0; i < pattern.length; i++) {
final String char = pattern[i];
if (char == placeholder) {
placeholderCount++;
formattedPattern += char;
} else {
formattedPattern += char;
}
}
formatters.add(FilteringTextInputFormatter.allow(RegExp('[a-zA-Z0-9]')));
formatters.add(TextInputFormatter.withFunction((oldValue, newValue) {
String newText = newValue.text.replaceAll(RegExp(r'[^a-zA-Z0-9]'), '');
if (newText.length > placeholderCount) {
newText = newText.substring(0, placeholderCount);
}
final StringBuffer buffer = StringBuffer();
int textIndex = 0;
for (int i = 0; i < formattedPattern.length; i++) {
if (formattedPattern[i] == placeholder) {
if (textIndex < newText.length) {
buffer.write(newText[textIndex]);
textIndex++;
} else {
break;
}
} else {
buffer.write(formattedPattern[i]);
}
}
final String formattedText = buffer.toString();
return TextEditingValue(
text: formattedText,
selection: TextSelection.collapsed(offset: formattedText.length),
);
}));
return formatters;
}