Skip to content

Commit 530425e

Browse files
Merge pull request #1 from ArturAssisComp/prototype-overload-operators
implemented the new prototype
2 parents 0930a51 + 60799ac commit 530425e

File tree

8 files changed

+1079
-273
lines changed

8 files changed

+1079
-273
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ validator, add a type validator, and then chain as many specialized validators a
431431
```dart
432432
// In this example, we build a validator composing a required, with a numeric and then a max.
433433
// The logic result is: required && numeric && max(70)
434+
434435
final validator = ValidatorBuilder.required(and: <Validator<Object, num>>[
435436
ValidatorBuilder.numeric(
436437
errorText: 'La edad debe ser numérica.',

example/lib/api_refactoring_main.dart

Lines changed: 95 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,6 @@ class MyApp extends StatelessWidget {
3232
}
3333
}
3434

35-
final class _NonNegativeNum<T extends num>
36-
extends BaseElementaryValidator<T, T> {
37-
_NonNegativeNum() : super(ignoreErrorMessage: false);
38-
39-
@override
40-
(bool, T?) transformValueIfValid(T value) {
41-
if (value >= 0) {
42-
return (true, value);
43-
}
44-
return (false, null);
45-
}
46-
47-
@override
48-
String get translatedErrorText => 'We cannot have a negative age';
49-
}
50-
5135
/// Represents the home page of the application.
5236
class NewAPIHomePage extends StatelessWidget {
5337
/// Constructs a new instance of the [NewAPIHomePage] class.
@@ -67,14 +51,11 @@ class NewAPIHomePage extends StatelessWidget {
6751
decoration: const InputDecoration(labelText: 'Age'),
6852
keyboardType: TextInputType.number,
6953
autovalidateMode: AutovalidateMode.always,
70-
validator: FormBuilderValidators.compose([
71-
ValidatorBuilder.required(and: <Validator<Object, num>>[
72-
ValidatorBuilder.numeric(
73-
errorText: 'La edad debe ser numérica.',
74-
and: <BaseElementaryValidator<num, dynamic>>[
75-
ValidatorBuilder.max(70),
76-
])
77-
]).validate,
54+
validator:
55+
FormBuilderValidators.compose(<FormFieldValidator<String>>[
56+
req(
57+
isNum(max(70), isNumMessage: 'La edad debe ser numérica.'),
58+
),
7859

7960
/// Include your own custom `FormFieldValidator` function, if you want
8061
/// Ensures positive values only. We could also have used `FormBuilderValidators.min( 0)` instead
@@ -87,7 +68,9 @@ class NewAPIHomePage extends StatelessWidget {
8768
return null;
8869
}
8970
]),
71+
9072
/*
73+
// Original api
9174
FormBuilderValidators.compose(<FormFieldValidator<String>>[
9275
/// Makes this field required
9376
FormBuilderValidators.required(),
@@ -119,16 +102,19 @@ class NewAPIHomePage extends StatelessWidget {
119102
const InputDecoration(labelText: 'Age (better way to do)'),
120103
keyboardType: TextInputType.number,
121104
autovalidateMode: AutovalidateMode.always,
122-
validator:
123-
// Equivalent to: required && numeric && max(70) && _NonNegativeNum
124-
ValidatorBuilder.required(and: <Validator<Object, num>>[
125-
ValidatorBuilder.numeric(
126-
errorText: 'La edad debe ser numérica.',
127-
and: <BaseElementaryValidator<num, dynamic>>[
128-
ValidatorBuilder.max(70),
129-
_NonNegativeNum<num>(),
130-
])
131-
]).validate,
105+
validator: req(
106+
isNum(
107+
and([
108+
max(70),
109+
(num value) {
110+
if (value < 0) return 'We cannot have a negative age';
111+
112+
return null;
113+
},
114+
]),
115+
isNumMessage: 'La edad debe ser numérica.',
116+
),
117+
),
132118
),
133119

134120
// Required Validator
@@ -138,7 +124,7 @@ class NewAPIHomePage extends StatelessWidget {
138124
prefixIcon: Icon(Icons.star),
139125
),
140126
// validator: FormBuilderValidators.required(),
141-
validator: ValidatorBuilder.required().validate,
127+
validator: req(null),
142128
autofillHints: const <String>[AutofillHints.name],
143129
textInputAction: TextInputAction.next,
144130
autovalidateMode: AutovalidateMode.always,
@@ -151,11 +137,11 @@ class NewAPIHomePage extends StatelessWidget {
151137
),
152138
keyboardType: TextInputType.number,
153139
//validator: FormBuilderValidators.numeric(),
154-
validator: ValidatorBuilder.required(
155-
ignoreErrorMessage: true,
156-
and: <Validator<Object, num>>[
157-
ValidatorBuilder.numeric()
158-
]).validate,
140+
// To maintain the previous behavior, we use msg. Below, there is a more precise way of doing that.
141+
validator: msg(
142+
FormBuilderLocalizations.current.numericErrorText,
143+
req(isNum(null))),
144+
159145
autofillHints: const <String>[AutofillHints.oneTimeCode],
160146
textInputAction: TextInputAction.next,
161147
autovalidateMode: AutovalidateMode.always,
@@ -167,23 +153,23 @@ class NewAPIHomePage extends StatelessWidget {
167153
),
168154
keyboardType: TextInputType.number,
169155
//validator: FormBuilderValidators.numeric(),
170-
validator: ValidatorBuilder.required(
171-
and: <Validator<Object, num>>[
172-
ValidatorBuilder.numeric()
173-
]).validate,
156+
validator: req(isNum(null)),
174157
autofillHints: const <String>[AutofillHints.oneTimeCode],
175158
textInputAction: TextInputAction.next,
176159
autovalidateMode: AutovalidateMode.always,
177160
),
178-
/*
179161
// Email Validator
180162
TextFormField(
181163
decoration: const InputDecoration(
182164
labelText: 'Email Field',
183165
prefixIcon: Icon(Icons.email),
184166
),
185167
keyboardType: TextInputType.emailAddress,
186-
validator: FormBuilderValidators.email(),
168+
//validator: FormBuilderValidators.email(),
169+
validator: msg(
170+
FormBuilderLocalizations.current.emailErrorText,
171+
req(email()),
172+
),
187173
autofillHints: const <String>[AutofillHints.email],
188174
textInputAction: TextInputAction.next,
189175
autovalidateMode: AutovalidateMode.always,
@@ -195,7 +181,11 @@ class NewAPIHomePage extends StatelessWidget {
195181
prefixIcon: Icon(Icons.link),
196182
),
197183
keyboardType: TextInputType.url,
198-
validator: FormBuilderValidators.url(),
184+
//validator: FormBuilderValidators.url(),
185+
validator: msg(
186+
FormBuilderLocalizations.current.urlErrorText,
187+
req(url()),
188+
),
199189
autofillHints: const <String>[AutofillHints.url],
200190
textInputAction: TextInputAction.next,
201191
autovalidateMode: AutovalidateMode.always,
@@ -206,7 +196,11 @@ class NewAPIHomePage extends StatelessWidget {
206196
labelText: 'Min Length Field',
207197
prefixIcon: Icon(Icons.text_fields),
208198
),
209-
validator: FormBuilderValidators.minLength(5),
199+
//validator: FormBuilderValidators.minLength(5),
200+
validator: msg(
201+
FormBuilderLocalizations.current.minLengthErrorText(5),
202+
req(minLength(5)),
203+
),
210204
textInputAction: TextInputAction.next,
211205
autovalidateMode: AutovalidateMode.always,
212206
),
@@ -216,7 +210,11 @@ class NewAPIHomePage extends StatelessWidget {
216210
labelText: 'Max Length Field',
217211
prefixIcon: Icon(Icons.text_fields),
218212
),
219-
validator: FormBuilderValidators.maxLength(10),
213+
//validator: FormBuilderValidators.maxLength(10),
214+
validator: msg(
215+
FormBuilderLocalizations.current.maxLengthErrorText(5),
216+
req(maxLength(5)),
217+
),
220218
textInputAction: TextInputAction.next,
221219
autovalidateMode: AutovalidateMode.always,
222220
),
@@ -227,7 +225,11 @@ class NewAPIHomePage extends StatelessWidget {
227225
prefixIcon: Icon(Icons.exposure_neg_1),
228226
),
229227
keyboardType: TextInputType.number,
230-
validator: FormBuilderValidators.min(10),
228+
//validator: FormBuilderValidators.min(10),
229+
validator: msg(
230+
FormBuilderLocalizations.current.minErrorText(10),
231+
req(isNum(min(10))),
232+
),
231233
textInputAction: TextInputAction.next,
232234
autovalidateMode: AutovalidateMode.always,
233235
),
@@ -238,7 +240,11 @@ class NewAPIHomePage extends StatelessWidget {
238240
prefixIcon: Icon(Icons.exposure_plus_1),
239241
),
240242
keyboardType: TextInputType.number,
241-
validator: FormBuilderValidators.max(100),
243+
//validator: FormBuilderValidators.max(100),
244+
validator: msg(
245+
FormBuilderLocalizations.current.maxErrorText(100),
246+
req(isNum(max(100))),
247+
),
242248
textInputAction: TextInputAction.next,
243249
autovalidateMode: AutovalidateMode.always,
244250
),
@@ -248,7 +254,8 @@ class NewAPIHomePage extends StatelessWidget {
248254
labelText: 'Equal Field',
249255
prefixIcon: Icon(Icons.check),
250256
),
251-
validator: FormBuilderValidators.equal('test'),
257+
//validator: FormBuilderValidators.equal('test'),
258+
validator: equal('test'),
252259
textInputAction: TextInputAction.next,
253260
autovalidateMode: AutovalidateMode.always,
254261
),
@@ -258,7 +265,11 @@ class NewAPIHomePage extends StatelessWidget {
258265
labelText: 'Contains "test"',
259266
prefixIcon: Icon(Icons.search),
260267
),
261-
validator: FormBuilderValidators.contains('test'),
268+
//validator: FormBuilderValidators.contains('test'),
269+
validator: msg(
270+
FormBuilderLocalizations.current.containsErrorText('test'),
271+
req(contains('test')),
272+
),
262273
textInputAction: TextInputAction.next,
263274
autovalidateMode: AutovalidateMode.always,
264275
),
@@ -268,8 +279,12 @@ class NewAPIHomePage extends StatelessWidget {
268279
labelText: 'Match Pattern',
269280
prefixIcon: Icon(Icons.pattern),
270281
),
271-
validator:
272-
FormBuilderValidators.match(RegExp(r'^[a-zA-Z0-9]+$')),
282+
//validator:
283+
// FormBuilderValidators.match(RegExp(r'^[a-zA-Z0-9]+$')),
284+
validator: msg(
285+
FormBuilderLocalizations.current.matchErrorText,
286+
req(match(RegExp(r'^[a-zA-Z0-9]+$'))),
287+
),
273288
textInputAction: TextInputAction.next,
274289
autovalidateMode: AutovalidateMode.always,
275290
),
@@ -280,7 +295,11 @@ class NewAPIHomePage extends StatelessWidget {
280295
prefixIcon: Icon(Icons.computer),
281296
),
282297
keyboardType: TextInputType.number,
283-
validator: FormBuilderValidators.ip(),
298+
// validator: FormBuilderValidators.ip(),
299+
validator: msg(
300+
FormBuilderLocalizations.current.ipErrorText,
301+
req(ip()),
302+
),
284303
textInputAction: TextInputAction.next,
285304
autovalidateMode: AutovalidateMode.always,
286305
),
@@ -290,7 +309,11 @@ class NewAPIHomePage extends StatelessWidget {
290309
labelText: 'UUID Field',
291310
prefixIcon: Icon(Icons.code),
292311
),
293-
validator: FormBuilderValidators.uuid(),
312+
//validator: FormBuilderValidators.uuid(),
313+
validator: msg(
314+
FormBuilderLocalizations.current.uuidErrorText,
315+
req(uuid()),
316+
),
294317
textInputAction: TextInputAction.next,
295318
autovalidateMode: AutovalidateMode.always,
296319
),
@@ -301,7 +324,11 @@ class NewAPIHomePage extends StatelessWidget {
301324
prefixIcon: Icon(Icons.credit_card),
302325
),
303326
keyboardType: TextInputType.number,
304-
validator: FormBuilderValidators.creditCard(),
327+
//validator: FormBuilderValidators.creditCard(),
328+
validator: msg(
329+
FormBuilderLocalizations.current.creditCardErrorText,
330+
req(creditCard()),
331+
),
305332
autofillHints: const <String>[AutofillHints.creditCardNumber],
306333
textInputAction: TextInputAction.next,
307334
autovalidateMode: AutovalidateMode.always,
@@ -313,7 +340,11 @@ class NewAPIHomePage extends StatelessWidget {
313340
prefixIcon: Icon(Icons.phone),
314341
),
315342
keyboardType: TextInputType.phone,
316-
validator: FormBuilderValidators.phoneNumber(),
343+
//validator: FormBuilderValidators.phoneNumber(),
344+
validator: msg(
345+
FormBuilderLocalizations.current.phoneErrorText,
346+
req(phoneNumber()),
347+
),
317348
autofillHints: const <String>[AutofillHints.telephoneNumber],
318349
textInputAction: TextInputAction.next,
319350
autovalidateMode: AutovalidateMode.always,
@@ -325,7 +356,8 @@ class NewAPIHomePage extends StatelessWidget {
325356
prefixIcon: Icon(Icons.lock),
326357
),
327358
obscureText: true,
328-
validator: FormBuilderValidators.password(),
359+
//validator: FormBuilderValidators.password(),
360+
validator: req(password()),
329361
autofillHints: const <String>[AutofillHints.password],
330362
textInputAction: TextInputAction.done,
331363
autovalidateMode: AutovalidateMode.always,
@@ -337,18 +369,19 @@ class NewAPIHomePage extends StatelessWidget {
337369
prefixIcon: Icon(Icons.calendar_today),
338370
),
339371
keyboardType: TextInputType.number,
372+
/*
340373
validator:
341374
FormBuilderValidators.compose(<FormFieldValidator<String>>[
342375
FormBuilderValidators.required(),
343376
FormBuilderValidators.numeric(),
344377
FormBuilderValidators.min(0),
345378
FormBuilderValidators.max(120),
346379
]),
380+
*/
381+
validator: req(isNum(and([min(0), max(120)]))),
347382
textInputAction: TextInputAction.done,
348383
autovalidateMode: AutovalidateMode.always,
349384
),
350-
351-
*/
352385
],
353386
),
354387
),

0 commit comments

Comments
 (0)