Advertisement
antasofa

DateTimeTextFormatter

Nov 15th, 2023
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 1.92 KB | None | 0 0
  1. import 'dart:math';
  2.  
  3. import 'package:flutter/services.dart';
  4.  
  5. class DateTimeTextFormatter extends TextInputFormatter {
  6.   static const _maxChars = 17;
  7.  
  8.   @override
  9.   TextEditingValue formatEditUpdate(
  10.     TextEditingValue oldValue,
  11.     TextEditingValue newValue,
  12.   ) {
  13.     String separatorDate = '/';
  14.     String spacing = ' ';
  15.     String separatorTime = ':';
  16.     var text = _format(
  17.       newValue.text,
  18.       oldValue.text,
  19.       separatorDate,
  20.       spacing,
  21.       separatorTime,
  22.     );
  23.  
  24.     return newValue.copyWith(
  25.       text: text,
  26.       selection: updateCursorPosition(
  27.         oldValue,
  28.         text,
  29.       ),
  30.     );
  31.   }
  32.  
  33.   String _format(
  34.     String value,
  35.     String oldValue,
  36.     String separatorDate,
  37.     String spacing,
  38.     String separatorTime,
  39.   ) {
  40.     var isErasing = value.length < oldValue.length;
  41.     var isComplete = value.length > _maxChars + 2;
  42.  
  43.     if (!isErasing && isComplete) {
  44.       return oldValue;
  45.     }
  46.  
  47.     value = value.replaceAll(separatorDate, '');
  48.     value = value.replaceAll(spacing, '');
  49.     value = value.replaceAll(separatorTime, '');
  50.     final result = <String>[];
  51.  
  52.     for (int i = 0; i < min(value.length, _maxChars); i++) {
  53.       result.add(value[i]);
  54.  
  55.       if ((i == 1 || i == 3) && i != value.length - 1) {
  56.         result.add(separatorDate);
  57.       }
  58.  
  59.       if ((i == 7) && i != value.length - 1) {
  60.         result.add(' ');
  61.       }
  62.       if ((i == 9 || i == 11) && i != value.length - 1) {
  63.         result.add(separatorTime);
  64.       }
  65.     }
  66. // (i == 1 || i == 3 || i == 7 || i == 9 || i == 11)
  67.     return result.join();
  68.   }
  69.  
  70.   TextSelection updateCursorPosition(
  71.     TextEditingValue oldValue,
  72.     String text,
  73.   ) {
  74.     var endOffset = max(
  75.       oldValue.text.length - oldValue.selection.end,
  76.       0,
  77.     );
  78.  
  79.     var selectionEnd = text.length - endOffset;
  80.  
  81.     return TextSelection.fromPosition(TextPosition(offset: selectionEnd));
  82.   }
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement