dateFormatter static method

List<TextInputFormatter> dateFormatter(
  1. FormatterEnum formatEnum, {
  2. String dateSeparator = '-',
  3. String timeSeparator = ':',
})

dateFormatter formats take format from the user like "MM/DD/YYYY" or "DD-MM-YYYY"

Implementation

static List<TextInputFormatter> dateFormatter(
  FormatterEnum formatEnum, {
  String dateSeparator = '-',
  String timeSeparator = ':',
}) {
  // Replace date and time separators in the format string
  String format = formatEnum.formatString
      .replaceAll('-', dateSeparator)
      .replaceAll(':', timeSeparator)
      .toUpperCase();

  final List<TextInputFormatter> formatters = [];
  String formattedFormat = '';
  // Acceptable pattern chars: D, M, Y, H, S (for date and time)
  final validChars = {'D', 'M', 'Y', 'H', 'S'};

  for (int i = 0; i < format.length; i++) {
    final String char = format[i];
    if (validChars.contains(char)) {
      formattedFormat += char;
    } else {
      formattedFormat += char;
    }
  }

  formatters.add(FilteringTextInputFormatter.allow(RegExp('[0-9]')));
  formatters.add(TextInputFormatter.withFunction((oldValue, newValue) {
    String newText = newValue.text.replaceAll(RegExp(r'[^0-9]'), '');
    int maxLength =
        formattedFormat.split('').where((c) => validChars.contains(c)).length;
    if (newText.length > maxLength) {
      newText = newText.substring(0, maxLength);
    }
    final StringBuffer buffer = StringBuffer();
    int textIndex = 0;
    for (int i = 0; i < formattedFormat.length; i++) {
      if (validChars.contains(formattedFormat[i])) {
        if (textIndex < newText.length) {
          buffer.write(newText[textIndex]);
          textIndex++;
        } else {
          break;
        }
      } else {
        if (textIndex < newText.length) {
          buffer.write(formattedFormat[i]);
        }
      }
    }
    final String formattedText = buffer.toString();
    return TextEditingValue(
      text: formattedText,
      selection: TextSelection.collapsed(offset: formattedText.length),
    );
  }));
  return formatters;
}