dateFormatter static method
List<TextInputFormatter>
dateFormatter(
- FormatterEnum formatEnum, {
- String dateSeparator = '-',
- 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;
}