56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter/services.dart';
 | |
| 
 | |
| class IDTextEditingController extends TextEditingController {
 | |
|   IDTextEditingController({String? text}) : super(text: text);
 | |
| 
 | |
|   String get id => trimID(value.text);
 | |
| 
 | |
|   set id(String newID) => text = formatID(newID);
 | |
| }
 | |
| 
 | |
| class IDTextInputFormatter extends TextInputFormatter {
 | |
|   @override
 | |
|   TextEditingValue formatEditUpdate(
 | |
|       TextEditingValue oldValue, TextEditingValue newValue) {
 | |
|     if (newValue.text.isEmpty) {
 | |
|       return newValue.copyWith(text: '');
 | |
|     } else if (newValue.text.compareTo(oldValue.text) == 0) {
 | |
|       return newValue;
 | |
|     } else {
 | |
|       int selectionIndexFromTheRight =
 | |
|           newValue.text.length - newValue.selection.extentOffset;
 | |
|       String newID = formatID(newValue.text);
 | |
|       return TextEditingValue(
 | |
|         text: newID,
 | |
|         selection: TextSelection.collapsed(
 | |
|           offset: newID.length - selectionIndexFromTheRight,
 | |
|         ),
 | |
|         // https://github.com/flutter/flutter/issues/78066#issuecomment-797869906
 | |
|         composing: newValue.composing,
 | |
|       );
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| String formatID(String id) {
 | |
|   String id2 = id.replaceAll(' ', '');
 | |
|   if (int.tryParse(id2) == null) return id;
 | |
|   String newID = '';
 | |
|   if (id2.length <= 3) {
 | |
|     newID = id2;
 | |
|   } else {
 | |
|     var n = id2.length;
 | |
|     var a = n % 3 != 0 ? n % 3 : 3;
 | |
|     newID = id2.substring(0, a);
 | |
|     for (var i = a; i < n; i += 3) {
 | |
|       newID += " ${id2.substring(i, i + 3)}";
 | |
|     }
 | |
|   }
 | |
|   return newID;
 | |
| }
 | |
| 
 | |
| String trimID(String id) {
 | |
|   return id.replaceAll(' ', '');
 | |
| }
 |