Advertisement
Guest User

MaskedTextController

a guest
Jan 16th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 2.33 KB | None | 0 0
  1. import 'package:flutter/material.dart';
  2.  
  3. class MaskedTextController extends TextEditingController {
  4.   MaskedTextController({String text, this.mask, Map<String, RegExp> translator}) : super(text: text) {
  5.     this.translator = translator ?? MaskedTextController.getDefaultTranslator();
  6.  
  7.     this.addListener(() {
  8.       this.updateText(this.text);
  9.     });
  10.  
  11.     this.updateText(this.text);
  12.   }
  13.  
  14.   final String mask;
  15.  
  16.   String get unmaskedText {
  17.     final filteredMasks = mask
  18.         .splitMapJoin("A", onMatch: (m) => "")
  19.         .splitMapJoin("0", onMatch: (m) => "")
  20.         .splitMapJoin("@", onMatch: (m) => "")
  21.         .splitMapJoin("*", onMatch: (m) => "")
  22.         .split("");
  23.     String text = this.text.trim();
  24.     for (String character in filteredMasks) {
  25.       text = text.replaceAll(character, "");
  26.     }
  27.     return text;
  28.   }
  29.  
  30.   Map<String, RegExp> translator;
  31.  
  32.   void updateText(String text) {
  33.     this.text = this._applyMask(this.mask, text);
  34.   }
  35.  
  36.   @override
  37.   set text(String newText) {
  38.     if (super.text != newText) {
  39.       super.text = newText;
  40.       this.selection = new TextSelection.fromPosition(new TextPosition(offset: (newText ?? '').length));
  41.     }
  42.   }
  43.  
  44.   static Map<String, RegExp> getDefaultTranslator() {
  45.     return {
  46.       'A': new RegExp(r'[A-Za-z]'),
  47.       '0': new RegExp(r'[0-9]'),
  48.       '@': new RegExp(r'[A-Za-z0-9]'),
  49.       '*': new RegExp(r'.*')
  50.     };
  51.   }
  52.  
  53.   String _applyMask(String mask, String value) {
  54.     String result = '';
  55.  
  56.     var maskCharIndex = 0;
  57.     var valueCharIndex = 0;
  58.  
  59.     while (maskCharIndex != mask.length && valueCharIndex != value.length) {
  60.       var maskChar = mask[maskCharIndex];
  61.       var valueChar = value[valueCharIndex];
  62.  
  63.       // value equals mask, just set
  64.       if (maskChar == valueChar) {
  65.         result += maskChar;
  66.         valueCharIndex += 1;
  67.         maskCharIndex += 1;
  68.         continue;
  69.       }
  70.  
  71.       // apply translator if match
  72.       if (this.translator.containsKey(maskChar)) {
  73.         if (this.translator[maskChar].hasMatch(valueChar)) {
  74.           result += valueChar;
  75.           maskCharIndex += 1;
  76.         }
  77.  
  78.         valueCharIndex += 1;
  79.         continue;
  80.       }
  81.  
  82.       // not masked value, fixed char on mask
  83.       result += maskChar;
  84.       maskCharIndex += 1;
  85.       continue;
  86.     }
  87.  
  88.     return result;
  89.   }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement