Skip to content

Commit b6c54f8

Browse files
Merge pull request #1065 from raifozdogan/lengthEqual_validator
lengthEqual validator added
2 parents 847a234 + c9d14ee commit b6c54f8

File tree

9 files changed

+115
-1
lines changed

9 files changed

+115
-1
lines changed

packages/form_builder_validators/lib/l10n/intl_en.arb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@
3939
"maxLength": {}
4040
}
4141
},
42+
"lengthEqualErrorText": "Value must have a length equal to {length}",
43+
"@lengthEqualErrorText": {
44+
"description": "Error Text for required field",
45+
"type": "text",
46+
"placeholders": {
47+
"length": {}
48+
}
49+
},
4250
"emailErrorText": "This field requires a valid email address.",
4351
"@emailErrorText": {
4452
"description": "Error Text for email field",

packages/form_builder_validators/lib/l10n/intl_messages.arb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@
5454
"maxLength": {}
5555
}
5656
},
57+
"lengthEqualErrorText": "Value must have a length equal to {length}",
58+
"@lengthEqualErrorText": {
59+
"description": "Error Text for required field",
60+
"type": "text",
61+
"placeholders": {
62+
"length": {}
63+
}
64+
},
5765
"emailErrorText": "This field requires a valid email address.",
5866
"@emailErrorText": {
5967
"description": "Error Text for email validator",

packages/form_builder_validators/lib/l10n/intl_tr.arb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@
3939
"maxLength": {}
4040
}
4141
},
42+
"lengthEqualErrorText": "Değerin uzunluğu {length} değerine eşit olmalıdır.",
43+
"@lengthEqualErrorText": {
44+
"description": "Error Text for required field",
45+
"type": "text",
46+
"placeholders": {
47+
"length": {}
48+
}
49+
},
4250
"emailErrorText": "Bu alan geçerli bir e-posta adresi gerektirir.",
4351
"@emailErrorText": {
4452
"description": "Error Text for email field",

packages/form_builder_validators/lib/localization/intl/messages_en.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class MessageLookup extends MessageLookupByLibrary {
2222

2323
static String m0(value) => "This field value must be equal to ${value}.";
2424

25+
static String m6(length) => "Value must have a length equal to ${length}";
26+
2527
static String m1(max) => "Value must be less than or equal to ${max}";
2628

2729
static String m2(maxLength) =>
@@ -47,6 +49,7 @@ class MessageLookup extends MessageLookupByLibrary {
4749
"This field requires a valid integer."),
4850
"ipErrorText": MessageLookupByLibrary.simpleMessage(
4951
"This field requires a valid IP."),
52+
"lengthEqualErrorText": m6,
5053
"matchErrorText": MessageLookupByLibrary.simpleMessage(
5154
"Value does not match pattern."),
5255
"maxErrorText": m1,

packages/form_builder_validators/lib/localization/intl/messages_messages.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class MessageLookup extends MessageLookupByLibrary {
2222

2323
static String m0(value) => "This field value must be equal to ${value}.";
2424

25+
static String m6(length) => "Value must have a length equal to ${length}";
26+
2527
static String m1(max) => "Value must be less than or equal to ${max}";
2628

2729
static String m2(maxLength) =>
@@ -47,6 +49,7 @@ class MessageLookup extends MessageLookupByLibrary {
4749
MessageLookupByLibrary.simpleMessage("Value must be an integer."),
4850
"ipErrorText": MessageLookupByLibrary.simpleMessage(
4951
"This field requires a valid IP."),
52+
"lengthEqualErrorText": m6,
5053
"matchErrorText": MessageLookupByLibrary.simpleMessage(
5154
"Value does not match pattern."),
5255
"maxErrorText": m1,

packages/form_builder_validators/lib/localization/intl/messages_tr.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ class MessageLookup extends MessageLookupByLibrary {
2323
static String m0(value) =>
2424
"Bu alanın değeri, ${value} değerine eşit olmalıdır.";
2525

26+
static String m6(length) =>
27+
"Değerin uzunluğu ${length} değerine eşit olmalıdır.";
28+
2629
static String m1(max) => "Değer ${max} değerinden küçük veya eşit olmalıdır.";
2730

2831
static String m2(maxLength) =>
@@ -49,6 +52,7 @@ class MessageLookup extends MessageLookupByLibrary {
4952
"Bu alan geçerli bir tamsayı gerektirir."),
5053
"ipErrorText": MessageLookupByLibrary.simpleMessage(
5154
"Bu alan geçerli bir IP adresi gerektirir."),
55+
"lengthEqualErrorText": m6,
5256
"matchErrorText": MessageLookupByLibrary.simpleMessage(
5357
"Lütfen geçerli bir değer giriniz."),
5458
"maxErrorText": m1,

packages/form_builder_validators/lib/localization/l10n.dart

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/form_builder_validators/lib/src/form_builder_validators.dart

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class FormBuilderValidators {
136136
assert(valueCandidate is String ||
137137
valueCandidate is Iterable ||
138138
valueCandidate == null);
139-
var valueLength = 0;
139+
int valueLength = 0;
140140
if (valueCandidate is String) valueLength = valueCandidate.length;
141141
if (valueCandidate is Iterable) valueLength = valueCandidate.length;
142142
return null != valueCandidate && valueLength > maxLength
@@ -146,6 +146,31 @@ class FormBuilderValidators {
146146
};
147147
}
148148

149+
/// [FormFieldValidator] that requires the length of the field to be
150+
/// equal to the provided length. Works with String, iterable and int types
151+
static FormFieldValidator<T> lengthEqual<T>(
152+
int length, {
153+
String? errorText,
154+
}) {
155+
assert(length > 0);
156+
return (T? valueCandidate) {
157+
assert(valueCandidate is String ||
158+
valueCandidate is Iterable ||
159+
valueCandidate is int ||
160+
valueCandidate == null);
161+
var valueLength = 0;
162+
163+
if (valueCandidate is int) valueLength = valueCandidate.toString().length;
164+
if (valueCandidate is String) valueLength = valueCandidate.length;
165+
if (valueCandidate is Iterable) valueLength = valueCandidate.length;
166+
167+
return valueLength != length
168+
? errorText ??
169+
FormBuilderLocalizations.current.lengthEqualErrorText(length)
170+
: null;
171+
};
172+
}
173+
149174
/// [FormFieldValidator] that requires the field's value to be a valid email address.
150175
static FormFieldValidator<String> email({
151176
String? errorText,

packages/form_builder_validators/test/form_builder_validators_test.dart

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,51 @@ void main() {
162162
expect(validatorAllowEmpty(null), isNull);
163163
expect(validatorAllowEmpty([]), isNull);
164164
}));
165+
testWidgets(
166+
'FormBuilderValidators.lengthEqual for Iterable',
167+
(WidgetTester tester) => testValidations(tester, (context) {
168+
final validator =
169+
FormBuilderValidators.lengthEqual<Iterable<String>>(3);
170+
171+
// Pass
172+
expect(validator(["a", "b", "c"]), isNull);
173+
174+
// Fail
175+
expect(validator(null), isNotNull);
176+
expect(validator([]), isNotNull);
177+
expect(validator(['one', 'two']), isNotNull);
178+
expect(validator(['one', 'two', 'three', 'four']), isNotNull);
179+
}));
180+
testWidgets(
181+
'FormBuilderValidators.lengthEqual for String',
182+
(WidgetTester tester) => testValidations(tester, (context) {
183+
final validator = FormBuilderValidators.lengthEqual<String>(3);
184+
185+
// Pass
186+
expect(validator("333"), isNull);
187+
188+
// Fail
189+
expect(validator(null), isNotNull);
190+
expect(validator(""), isNotNull);
191+
expect(validator("22"), isNotNull);
192+
expect(validator("4444"), isNotNull);
193+
}));
194+
195+
testWidgets(
196+
'FormBuilderValidators.lengthEqual for int',
197+
(WidgetTester tester) => testValidations(tester, (context) {
198+
final validator = FormBuilderValidators.lengthEqual<int>(3);
199+
200+
// Pass
201+
expect(validator(333), isNull);
202+
203+
// Fail
204+
expect(validator(null), isNotNull);
205+
expect(validator(0), isNotNull);
206+
expect(validator(1), isNotNull);
207+
expect(validator(22), isNotNull);
208+
expect(validator(4444), isNotNull);
209+
}));
165210

166211
testWidgets(
167212
'FormBuilderValidators.email',

0 commit comments

Comments
 (0)