Skip to content

Commit e9ce02e

Browse files
committed
Fixed #70
1 parent 7d165b8 commit e9ce02e

12 files changed

Lines changed: 160 additions & 70 deletions

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## [2.5.1]
2+
- New PosInputFormatter. Thanks to [SimoneBressan](https://github.com/SimoneBres) for this contribution
3+
- Fixed the issue with CreditCardExpirationDateFormatter https://github.com/caseyryan/flutter_multi_formatter/issues/70
14
## [2.4.4]
25
- https://github.com/caseyryan/flutter_multi_formatter/issues/68 fixed a typo in README section
36
- Added alternative mask for Australean phone numbers

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ RestrictingInputFormatter
8787
8888
/// for currencies
8989
MoneyInputFormatter
90+
PosInputFormatter
9091
```
9192

9293
## Utility methods and widgets
@@ -341,6 +342,8 @@ TextFormField(
341342
],
342343
),
343344
```
345+
346+
344347
## Money Input formatter
345348

346349
```dart
@@ -371,6 +374,20 @@ TextFormField(
371374
372375
```
373376

377+
## Point of Sale input formatter
378+
```dart
379+
PosInputFormatter
380+
```
381+
Allows you to enter numbers like you would normally do
382+
on a sales terminal
383+
```dart
384+
TextFormField(
385+
keyboardType: TextInputType.number,
386+
inputFormatters: [
387+
PosInputFormatter(),
388+
],
389+
),
390+
...
374391
375392
376393
For more details see [example](https://github.com/caseyryan/flutter_multi_formatter/tree/master/example) project. And feel free to open an issue if you find any bugs of errors
Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
<?xml version="1.0" encoding="UTF-8"?>
2-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3-
<plist version="1.0">
4-
<dict>
5-
<key>CFBundleDevelopmentRegion</key>
6-
<string>$(DEVELOPMENT_LANGUAGE)</string>
7-
<key>CFBundleExecutable</key>
8-
<string>App</string>
9-
<key>CFBundleIdentifier</key>
10-
<string>io.flutter.flutter.app</string>
11-
<key>CFBundleInfoDictionaryVersion</key>
12-
<string>6.0</string>
13-
<key>CFBundleName</key>
14-
<string>App</string>
15-
<key>CFBundlePackageType</key>
16-
<string>FMWK</string>
17-
<key>CFBundleShortVersionString</key>
18-
<string>1.0</string>
19-
<key>CFBundleSignature</key>
20-
<string>????</string>
21-
<key>CFBundleVersion</key>
22-
<string>1.0</string>
23-
<key>MinimumOSVersion</key>
24-
<string>8.0</string>
25-
</dict>
26-
</plist>
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>CFBundleDevelopmentRegion</key>
6+
<string>$(DEVELOPMENT_LANGUAGE)</string>
7+
<key>CFBundleExecutable</key>
8+
<string>App</string>
9+
<key>CFBundleIdentifier</key>
10+
<string>io.flutter.flutter.app</string>
11+
<key>CFBundleInfoDictionaryVersion</key>
12+
<string>6.0</string>
13+
<key>CFBundleName</key>
14+
<string>App</string>
15+
<key>CFBundlePackageType</key>
16+
<string>FMWK</string>
17+
<key>CFBundleShortVersionString</key>
18+
<string>1.0</string>
19+
<key>CFBundleSignature</key>
20+
<string>????</string>
21+
<key>CFBundleVersion</key>
22+
<string>1.0</string>
23+
<key>MinimumOSVersion</key>
24+
<string>9.0</string>
25+
</dict>
26+
</plist>

example/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@
280280
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
281281
GCC_WARN_UNUSED_FUNCTION = YES;
282282
GCC_WARN_UNUSED_VARIABLE = YES;
283-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
283+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
284284
MTL_ENABLE_DEBUG_INFO = NO;
285285
SDKROOT = iphoneos;
286286
SUPPORTED_PLATFORMS = iphoneos;
@@ -362,7 +362,7 @@
362362
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
363363
GCC_WARN_UNUSED_FUNCTION = YES;
364364
GCC_WARN_UNUSED_VARIABLE = YES;
365-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
365+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
366366
MTL_ENABLE_DEBUG_INFO = YES;
367367
ONLY_ACTIVE_ARCH = YES;
368368
SDKROOT = iphoneos;
@@ -411,7 +411,7 @@
411411
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
412412
GCC_WARN_UNUSED_FUNCTION = YES;
413413
GCC_WARN_UNUSED_VARIABLE = YES;
414-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
414+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
415415
MTL_ENABLE_DEBUG_INFO = NO;
416416
SDKROOT = iphoneos;
417417
SUPPORTED_PLATFORMS = iphoneos;

example/pubspec.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ packages:
77
name: async
88
url: "https://pub.dartlang.org"
99
source: hosted
10-
version: "2.6.1"
10+
version: "2.8.1"
1111
base58check:
1212
dependency: transitive
1313
description:
@@ -42,7 +42,7 @@ packages:
4242
name: charcode
4343
url: "https://pub.dartlang.org"
4444
source: hosted
45-
version: "1.2.0"
45+
version: "1.3.1"
4646
clock:
4747
dependency: transitive
4848
description:
@@ -96,7 +96,7 @@ packages:
9696
path: ".."
9797
relative: true
9898
source: path
99-
version: "2.4.4"
99+
version: "2.5.1"
100100
flutter_test:
101101
dependency: "direct dev"
102102
description: flutter
@@ -115,7 +115,7 @@ packages:
115115
name: meta
116116
url: "https://pub.dartlang.org"
117117
source: hosted
118-
version: "1.3.0"
118+
version: "1.7.0"
119119
path:
120120
dependency: transitive
121121
description:
@@ -169,7 +169,7 @@ packages:
169169
name: test_api
170170
url: "https://pub.dartlang.org"
171171
source: hosted
172-
version: "0.3.0"
172+
version: "0.4.2"
173173
typed_data:
174174
dependency: transitive
175175
description:

lib/formatters/credit_card_cvc_input_formatter.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ THE SOFTWARE.
2727
import 'package:flutter_multi_formatter/formatters/masked_input_formatter.dart';
2828

2929
class CreditCardCvcInputFormatter extends MaskedInputFormatter {
30-
CreditCardCvcInputFormatter() : super('0000');
30+
CreditCardCvcInputFormatter() : super('000');
3131
}

lib/formatters/credit_card_expiration_input_formatter.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,18 @@ class CreditCardExpirationDateFormatter extends MaskedInputFormatter {
3535
var fv = super.applyMask(text);
3636
var result = fv.toString();
3737
var numericString = toNumericString(result);
38+
var numAddedLeadingSymbols = 0;
3839
String? ammendedMonth;
3940
if (numericString.length > 0) {
4041
var allDigits = numericString.split('');
4142
var stringBuffer = StringBuffer();
4243
var firstDigit = int.parse(allDigits[0]);
44+
4345
if (firstDigit > 1) {
4446
stringBuffer.write('0');
4547
stringBuffer.write(firstDigit);
4648
ammendedMonth = stringBuffer.toString();
49+
numAddedLeadingSymbols = 1;
4750
} else if (firstDigit == 1) {
4851
if (allDigits.length > 1) {
4952
stringBuffer.write(firstDigit);
@@ -65,6 +68,12 @@ class CreditCardExpirationDateFormatter extends MaskedInputFormatter {
6568
result = '$ammendedMonth$sub';
6669
}
6770
}
71+
fv = super.applyMask(result);
72+
/// a little hack to be able to move caret by one
73+
/// symbol to the right if a leading zero was added automatically
74+
for (var i = 0; i < numAddedLeadingSymbols; i++) {
75+
fv.increaseNumberOfLeadingSymbols();
76+
}
6877
return fv;
6978
}
7079
}

lib/formatters/credit_card_number_input_formatter.dart

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,28 +61,36 @@ class CreditCardNumberInputFormatter extends TextInputFormatter {
6161
if (newValue.text.isEmpty) {
6262
_removeFirstLetter();
6363
}
64-
65-
/// FIXME: не помню зачем это добавлял но из-за этого не
66-
/// работало форматирование при стирании. Если что-то сломается, разобраться
67-
/// подробнее
68-
// return newValue;
6964
}
70-
var onlyNumbers = toNumericString(newValue.text);
71-
String maskedValue = _applyMask(onlyNumbers);
65+
var onlyNumbers = toNumericString(
66+
newValue.text,
67+
);
68+
String maskedValue = _applyMask(
69+
onlyNumbers,
70+
);
7271
if (maskedValue.length == oldValue.text.length) {
7372
return oldValue;
7473
}
75-
var endOffset = max(oldValue.text.length - oldValue.selection.end, 0);
74+
var endOffset = max(
75+
oldValue.text.length - oldValue.selection.end,
76+
0,
77+
);
7678
var selectionEnd = maskedValue.length - endOffset;
7779
return TextEditingValue(
78-
selection: TextSelection.collapsed(offset: selectionEnd),
80+
selection: TextSelection.collapsed(
81+
offset: selectionEnd,
82+
),
7983
text: maskedValue,
8084
);
8185
}
8286

8387
/// this is a small dirty hask to be able to remove the first character
8488
Future _removeFirstLetter() async {
85-
await Future.delayed(Duration(milliseconds: 5));
89+
await Future.delayed(
90+
Duration(
91+
milliseconds: 5,
92+
),
93+
);
8694
_updateCardSystemData(null);
8795
}
8896

@@ -95,15 +103,19 @@ class CreditCardNumberInputFormatter extends TextInputFormatter {
95103
}
96104
}
97105

98-
String _applyMask(String numericString) {
106+
String _applyMask(
107+
String numericString,
108+
) {
99109
if (numericString.isEmpty) {
100110
_updateCardSystemData(null);
101111
} else {
102112
var countryData = _CardSystemDatas.getCardSystemDataByNumber(
103113
numericString,
104114
);
105115
if (countryData != null) {
106-
_updateCardSystemData(countryData);
116+
_updateCardSystemData(
117+
countryData,
118+
);
107119
}
108120
}
109121
if (_cardSystemData != null) {
@@ -232,8 +244,7 @@ class _CardSystemDatas {
232244
if (rawData != null) {
233245
return CardSystemData.fromMap(rawData);
234246
}
235-
return getCardSystemDataByNumber(cardNumber,
236-
subscringLength: subscringLength - 1);
247+
return getCardSystemDataByNumber(cardNumber, subscringLength: subscringLength - 1);
237248
}
238249

239250
static int get _maxDigitsInCard {

lib/formatters/masked_input_formatter.dart

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,26 @@ class MaskedInputFormatter extends TextInputFormatter {
8585
var numSeparatorsInNew = 0;
8686
var numSeparatorsInOld = 0;
8787

88+
/// For not it's only used in CreditCardExpirationDateFormatter
89+
/// when it adds a leading zero to the input
90+
var addOffset = newFormattedValue._numLeadingSymbols;
91+
92+
8893
/// without this condition there might be a range exception
8994
if (oldValue.selection.end <= oldFormattedValue.text.length) {
9095
numSeparatorsInOld = _countSeparators(
91-
oldFormattedValue.text.substring(0, oldValue.selection.end),
96+
oldFormattedValue.text.substring(
97+
0,
98+
oldValue.selection.end,
99+
),
92100
);
93101
}
94102
if (newValue.selection.end <= newFormattedValue.text.length) {
95103
numSeparatorsInNew = _countSeparators(
96-
newFormattedValue.text.substring(0, newValue.selection.end),
104+
newFormattedValue.text.substring(
105+
0,
106+
newValue.selection.end,
107+
),
97108
);
98109
} else {
99110
numSeparatorsInNew = numSeparatorsInOld;
@@ -113,7 +124,7 @@ class MaskedInputFormatter extends TextInputFormatter {
113124
return TextEditingValue(
114125
text: _maskedValue,
115126
selection: TextSelection.collapsed(
116-
offset: selectionOffset,
127+
offset: selectionOffset + addOffset,
117128
affinity: TextAffinity.upstream,
118129
),
119130
);
@@ -201,11 +212,18 @@ class MaskedInputFormatter extends TextInputFormatter {
201212
class FormattedValue {
202213
String _formattedValue = '';
203214
bool _isErasing = false;
215+
int _numLeadingSymbols = 0;
204216

205217
String get text {
206218
return _formattedValue;
207219
}
208220

221+
/// Used in CreditCardExpirationInputFormatter
222+
/// to be able to add a leading zero
223+
void increaseNumberOfLeadingSymbols() {
224+
_numLeadingSymbols++;
225+
}
226+
209227
@override
210228
String toString() {
211229
return _formattedValue;

0 commit comments

Comments
 (0)