customPatternFormatter static method

List<TextInputFormatter> customPatternFormatter(
  1. String pattern, {
  2. String placeholder = 'X',
})

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;
}