Skip to content

Commit 70c7594

Browse files
remove the verb 'is' from required validators
1 parent dec4504 commit 70c7594

File tree

7 files changed

+51
-55
lines changed

7 files changed

+51
-55
lines changed

example/lib/basic_examples.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class BasicExamplesPage extends StatelessWidget {
5454
const InputDecoration(labelText: 'Input must not be null'),
5555
autovalidateMode: AutovalidateMode.onUserInteraction,
5656
validator: (String? input) {
57-
final String? isRequiredMsg = Validators.isRequired()(input);
57+
final String? isRequiredMsg = Validators.required()(input);
5858
return isRequiredMsg
5959
?.toUpperCase()
6060
.replaceFirst('OVERRIDE: ', '');

example/lib/forms_with_validate_granularlly.dart

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class _BodyState extends State<_Body> {
7575
hintText: 'Enter your full name',
7676
prefixIcon: Icon(Icons.person),
7777
),
78-
validator: V.isRequired(V.match(RegExp('[A-Z].*'),
78+
validator: V.required(V.match(RegExp('[A-Z].*'),
7979
matchMsg: (_) => 'The name must start with uppercase')),
8080
textInputAction: TextInputAction.next,
8181
),
@@ -87,7 +87,7 @@ class _BodyState extends State<_Body> {
8787
hintText: 'Enter your email',
8888
prefixIcon: Icon(Icons.email),
8989
),
90-
validator: V.isRequired(V.email()),
90+
validator: V.required(V.email()),
9191
keyboardType: TextInputType.emailAddress,
9292
textInputAction: TextInputAction.next,
9393
),
@@ -100,8 +100,7 @@ class _BodyState extends State<_Body> {
100100
hintText: 'YYYY-MM-DD',
101101
prefixIcon: Icon(Icons.calendar_today),
102102
),
103-
validator: V.isRequired(V.isDateTime(V.isBefore(
104-
DateTime.now(),
103+
validator: V.required(V.isDateTime(V.isBefore(DateTime.now(),
105104
isBeforeMsg: (_, __) => 'Date must be in the past.'))),
106105
keyboardType: TextInputType.datetime,
107106
textInputAction: TextInputAction.next,
@@ -127,7 +126,7 @@ class _BodyState extends State<_Body> {
127126
prefixIcon: Icon(Icons.height),
128127
suffixText: 'm',
129128
),
130-
validator: V.isRequired(V.isNum(V.between(0.5, 2.5,
129+
validator: V.required(V.isNum(V.between(0.5, 2.5,
131130
betweenMsg: (_, num min, num max, __, ___) =>
132131
'Please enter a realistic height [$min-${max}m]'))),
133132
keyboardType: TextInputType.number,
@@ -142,7 +141,7 @@ class _BodyState extends State<_Body> {
142141
prefixIcon: Icon(Icons.monitor_weight),
143142
suffixText: 'kg',
144143
),
145-
validator: V.isOptional(V.isNum(V.between(20, 300,
144+
validator: V.optional(V.isNum(V.between(20, 300,
146145
betweenMsg: (_, num min, num max, ____, _____) =>
147146
'weight must be in [$min, ${max}kg]'))),
148147
keyboardType: TextInputType.number,
@@ -156,7 +155,7 @@ class _BodyState extends State<_Body> {
156155
hintText: 'Enter your phone number',
157156
prefixIcon: Icon(Icons.phone),
158157
),
159-
validator: V.isRequired(),
158+
validator: V.required(),
160159
keyboardType: TextInputType.phone,
161160
textInputAction: TextInputAction.next,
162161
),
@@ -181,7 +180,7 @@ class _BodyState extends State<_Body> {
181180
child: Text('Invalid option 2'),
182181
),
183182
]).toList(),
184-
validator: V.isRequired(V.isInList(validBloodTypeOptions,
183+
validator: V.required(V.isInList(validBloodTypeOptions,
185184
isInListMsg: (_, List<String> v) =>
186185
'The option must be one of: ${v.join(', ')}.')),
187186
onChanged: (String? value) {

example/lib/generic_examples.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class GenericExamplesPage extends StatelessWidget {
2424
decoration: const InputDecoration(labelText: 'Age'),
2525
keyboardType: TextInputType.number,
2626
autovalidateMode: AutovalidateMode.always,
27-
validator: V.isRequired(V.and(<Validator<String>>[
27+
validator: V.required(V.and(<Validator<String>>[
2828
V.isNum(V.lessThan(70), (_) => 'La edad debe ser numérica.'),
2929

3030
/// Include your own custom `FormFieldValidator` function, if you want
@@ -47,7 +47,7 @@ class GenericExamplesPage extends StatelessWidget {
4747
labelText: 'Required Field',
4848
prefixIcon: Icon(Icons.star),
4949
),
50-
validator: V.isRequired(),
50+
validator: V.required(),
5151
autofillHints: const <String>[AutofillHints.name],
5252
textInputAction: TextInputAction.next,
5353
autovalidateMode: AutovalidateMode.always,
@@ -59,7 +59,7 @@ class GenericExamplesPage extends StatelessWidget {
5959
prefixIcon: Icon(Icons.numbers),
6060
),
6161
keyboardType: TextInputType.number,
62-
validator: V.isRequired(V.isNum()),
62+
validator: V.required(V.isNum()),
6363
autofillHints: const <String>[AutofillHints.oneTimeCode],
6464
textInputAction: TextInputAction.next,
6565
autovalidateMode: AutovalidateMode.always,
@@ -96,7 +96,7 @@ class GenericExamplesPage extends StatelessWidget {
9696
labelText: 'Min Length Field',
9797
prefixIcon: Icon(Icons.text_fields),
9898
),
99-
validator: V.isRequired(V.minLength(5)),
99+
validator: V.required(V.minLength(5)),
100100
textInputAction: TextInputAction.next,
101101
autovalidateMode: AutovalidateMode.always,
102102
),
@@ -106,7 +106,7 @@ class GenericExamplesPage extends StatelessWidget {
106106
labelText: 'Max Length Field',
107107
prefixIcon: Icon(Icons.text_fields),
108108
),
109-
validator: V.isRequired(V.maxLength(10)),
109+
validator: V.required(V.maxLength(10)),
110110
textInputAction: TextInputAction.next,
111111
autovalidateMode: AutovalidateMode.always,
112112
),
@@ -117,7 +117,7 @@ class GenericExamplesPage extends StatelessWidget {
117117
prefixIcon: Icon(Icons.exposure_neg_1),
118118
),
119119
keyboardType: TextInputType.number,
120-
validator: V.isRequired(V.isNum(V.greaterThan(10))),
120+
validator: V.required(V.isNum(V.greaterThan(10))),
121121
textInputAction: TextInputAction.next,
122122
autovalidateMode: AutovalidateMode.always,
123123
),
@@ -128,7 +128,7 @@ class GenericExamplesPage extends StatelessWidget {
128128
prefixIcon: Icon(Icons.exposure_plus_1),
129129
),
130130
keyboardType: TextInputType.number,
131-
validator: V.isRequired(V.isNum(V.lessThan(100))),
131+
validator: V.required(V.isNum(V.lessThan(100))),
132132
textInputAction: TextInputAction.next,
133133
autovalidateMode: AutovalidateMode.always,
134134
),
@@ -161,7 +161,7 @@ class GenericExamplesPage extends StatelessWidget {
161161
labelText: 'Match Pattern',
162162
prefixIcon: Icon(Icons.pattern),
163163
),
164-
validator: V.isRequired(V.match(RegExp(r'^[a-zA-Z0-9]+$'))),
164+
validator: V.required(V.match(RegExp(r'^[a-zA-Z0-9]+$'))),
165165
textInputAction: TextInputAction.next,
166166
autovalidateMode: AutovalidateMode.always,
167167
),
@@ -220,7 +220,7 @@ class GenericExamplesPage extends StatelessWidget {
220220
prefixIcon: Icon(Icons.lock),
221221
),
222222
obscureText: true,
223-
validator: V.isRequired(V.password()),
223+
validator: V.required(V.password()),
224224
autofillHints: const <String>[AutofillHints.password],
225225
textInputAction: TextInputAction.done,
226226
autovalidateMode: AutovalidateMode.always,
@@ -232,7 +232,7 @@ class GenericExamplesPage extends StatelessWidget {
232232
prefixIcon: Icon(Icons.calendar_today),
233233
),
234234
keyboardType: TextInputType.number,
235-
validator: V.isRequired(
235+
validator: V.required(
236236
V.isNum(V.and(<Validator<num>>[V.between(0, 120)]))),
237237
textInputAction: TextInputAction.done,
238238
autovalidateMode: AutovalidateMode.always,

lib/src/form_builder_validators.dart

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2027,8 +2027,7 @@ final class Validators {
20272027
val.notEqual(value, notEqualMsg: notEqualMsg);
20282028

20292029
// Required validators
2030-
// TODO remove verb 'is' from validators
2031-
/// {@template validator_is_required}
2030+
/// {@template validator_required}
20322031
/// Generates a validator function that enforces required field validation for
20332032
/// form inputs. This validator ensures that a field has a non-null, non-empty
20342033
/// value before any subsequent validation is performed.
@@ -2043,7 +2042,7 @@ final class Validators {
20432042
/// - `next` (`Validator<T>?`): An optional subsequent validator function that
20442043
/// will be applied after the required validation passes. This allows for
20452044
/// chaining multiple validation rules.
2046-
/// - `isRequiredMsg` (`String?`): An optional custom error message to display
2045+
/// - `requiredMsg` (`String?`): An optional custom error message to display
20472046
/// when the field is empty or null. If not provided, defaults to the
20482047
/// localized required field error text.
20492048
///
@@ -2056,13 +2055,13 @@ final class Validators {
20562055
/// ## Examples
20572056
/// ```dart
20582057
/// // Basic required field validation
2059-
/// final validator = isRequired<String>();
2058+
/// final validator = Validators.required<String>();
20602059
/// print(validator(null)); // Returns localized error message
20612060
/// print(validator('')); // Returns localized error message
20622061
/// print(validator('value')); // Returns null (validation passed)
20632062
///
20642063
/// // Chaining with another validator
2065-
/// final complexValidator = isRequired<String>(
2064+
/// final complexValidator = Validators.required<String>(
20662065
/// (value) => value.length < 10 ? 'Too long' : null,
20672066
/// 'Custom required message'
20682067
/// );
@@ -2072,13 +2071,13 @@ final class Validators {
20722071
/// - The validator assumes empty strings/maps/iterables, white strings, and null
20732072
/// values are equivalent for validation purposes
20742073
/// {@endtemplate}
2075-
static Validator<T?> isRequired<T extends Object>([
2074+
static Validator<T?> required<T extends Object>([
20762075
Validator<T>? next,
2077-
String? isRequiredMsg,
2076+
String? requiredMsg,
20782077
]) =>
2079-
val.isRequired(next, isRequiredMsg);
2078+
val.required(next, requiredMsg);
20802079

2081-
/// {@template validator_is_optional}
2080+
/// {@template validator_optional}
20822081
/// Creates a validator function that makes a field optional while allowing additional validation
20832082
/// rules. This validator is particularly useful in form validation scenarios where certain
20842083
/// fields are not mandatory but still need to conform to specific rules when provided.
@@ -2097,7 +2096,7 @@ final class Validators {
20972096
/// - `next` (`Validator<T>?`): An optional subsequent validator function that will be
20982097
/// applied only if the input value is provided (non-null and non-empty). This allows
20992098
/// for chaining validation rules.
2100-
/// - `isOptionalMsg` (`String Function(T input, String nextErrorMessage)?`): An
2099+
/// - `optionalMsg` (`String Function(T input, String nextErrorMessage)?`): An
21012100
/// optional error message that takes the `input` and the `nextErrorMessage` as
21022101
/// parameters and returns the custom error message.
21032102
///
@@ -2111,10 +2110,10 @@ final class Validators {
21112110
/// ## Examples
21122111
/// ```dart
21132112
/// // Basic optional string validator
2114-
/// final validator = isOptional<String>();
2113+
/// final validator = Validators.optional<String>();
21152114
///
21162115
/// // Optional validator with additional email validation
2117-
/// final emailValidator = isOptional<String>(
2116+
/// final emailValidator = Validators.optional<String>(
21182117
/// validateEmail,
21192118
/// (_, error) => 'Invalid email format: $error',
21202119
/// );
@@ -2129,11 +2128,11 @@ final class Validators {
21292128
/// - The validator assumes empty strings/maps/iterables, white strings, and null values are
21302129
/// equivalent for validation purposes, all them are considered valid.
21312130
/// {@endtemplate}
2132-
static Validator<T?> isOptional<T extends Object>([
2131+
static Validator<T?> optional<T extends Object>([
21332132
Validator<T>? next,
2134-
String Function(T input, String nextErrorMsg)? isOptionalMsg,
2133+
String Function(T input, String nextErrorMsg)? optionalMsg,
21352134
]) =>
2136-
val.isOptional(next, isOptionalMsg);
2135+
val.optional(next, optionalMsg);
21372136

21382137
/// {@template validator_validate_with_default}
21392138
/// Creates a validator function that applies a default value before validation,
@@ -2167,7 +2166,7 @@ final class Validators {
21672166
///
21682167
/// // Wrap it with a default value of 'N/A'
21692168
/// final defaultValue = 'default value';
2170-
/// final validator = validateWithDefault('N/A', minLength);
2169+
/// final validator = Validators.validateWithDefault('N/A', minLength);
21712170
///
21722171
/// print(validator(null)); // Returns null (valid)
21732172
/// print(validator('ab')); // Returns 'Must be at least 3 characters'

lib/src/validators/core_validators/required_validators.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
import '../../../localization/l10n.dart';
22
import '../constants.dart';
33

4-
/// {@macro validator_is_required}
5-
Validator<T?> isRequired<T extends Object>([
4+
/// {@macro validator_required}
5+
Validator<T?> required<T extends Object>([
66
Validator<T>? next,
7-
String? isRequiredMsg,
7+
String? requiredMsg,
88
]) {
99
String? finalValidator(T? value) {
1010
final (bool isValid, T? transformedValue) =
1111
_isRequiredValidateAndConvert(value);
1212
if (!isValid) {
13-
return isRequiredMsg ??
14-
FormBuilderLocalizations.current.requiredErrorText;
13+
return requiredMsg ?? FormBuilderLocalizations.current.requiredErrorText;
1514
}
1615
return next?.call(transformedValue!);
1716
}
@@ -25,10 +24,10 @@ Validator<T?> validateWithDefault<T extends Object>(
2524
return (T? value) => next(value ?? defaultValue);
2625
}
2726

28-
/// {@macro validator_is_optional}
29-
Validator<T?> isOptional<T extends Object>([
27+
/// {@macro validator_optional}
28+
Validator<T?> optional<T extends Object>([
3029
Validator<T>? next,
31-
String Function(T input, String nextErrorMsg)? isOptionalMsg,
30+
String Function(T input, String nextErrorMsg)? optionalMsg,
3231
]) {
3332
return (T? input) {
3433
final (bool isValid, T? transformedValue) =
@@ -42,7 +41,7 @@ Validator<T?> isOptional<T extends Object>([
4241
return null;
4342
}
4443

45-
return isOptionalMsg?.call(input!, nextErrorMessage) ??
44+
return optionalMsg?.call(input!, nextErrorMessage) ??
4645
FormBuilderLocalizations.current.isOptionalErrorText(nextErrorMessage);
4746
};
4847
}

test/src/validators/core_validators/required_validators/is_optional_validator_test.dart renamed to test/src/validators/core_validators/required_validators/optional_validator_test.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ void main() {
1111
final String defaultError =
1212
FormBuilderLocalizations.current.isOptionalErrorText(errorMultBy6);
1313

14-
group('Validator: isOptional', () {
14+
group('Validator: optional', () {
1515
test('Should make the input optional', () {
16-
final Validator<Object?> v = isOptional();
16+
final Validator<Object?> v = optional();
1717

1818
expect(v(null), isNull);
1919
expect(v(''), isNull);
@@ -25,7 +25,7 @@ void main() {
2525
});
2626

2727
test('Should make the input optional with composed validator `v`', () {
28-
final Validator<int?> v = isOptional(isMultipleBy6);
28+
final Validator<int?> v = optional(isMultipleBy6);
2929

3030
expect(v(null), isNull);
3131
expect(v(0), isNull);
@@ -36,9 +36,8 @@ void main() {
3636

3737
test('Should return custom message for invalid input', () {
3838
const String customMsg = 'custom error message ';
39-
final Validator<Object?> v = isOptional(null, (_, __) => customMsg);
40-
final Validator<int?> v1 =
41-
isOptional(isMultipleBy6, (_, __) => customMsg);
39+
final Validator<Object?> v = optional(null, (_, __) => customMsg);
40+
final Validator<int?> v1 = optional(isMultipleBy6, (_, __) => customMsg);
4241

4342
expect(v(null), isNull);
4443
expect(v(''), isNull);

test/src/validators/core_validators/required_validators/is_required_validator_test.dart renamed to test/src/validators/core_validators/required_validators/required_validator_test.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ void main() {
1111
final String defaultError =
1212
FormBuilderLocalizations.current.requiredErrorText;
1313

14-
group('Validator: isRequired', () {
14+
group('Validator: required', () {
1515
test('Should check if the input value is not null/empty', () {
16-
final Validator<Object?> v = isRequired();
16+
final Validator<Object?> v = required();
1717

1818
expect(v(null), defaultError);
1919
expect(v(''), defaultError);
@@ -27,7 +27,7 @@ void main() {
2727
test(
2828
'Should check if the input value is not null/empty with composed validator `v`',
2929
() {
30-
final Validator<int?> v = isRequired(isMultipleBy6);
30+
final Validator<int?> v = required(isMultipleBy6);
3131

3232
expect(v(null), equals(defaultError));
3333
expect(v(0), isNull);
@@ -38,8 +38,8 @@ void main() {
3838

3939
test('Should return custom message for null input', () {
4040
const String customMsg = 'custom error message ';
41-
final Validator<Object?> v = isRequired(null, customMsg);
42-
final Validator<int?> v1 = isRequired(isMultipleBy6, customMsg);
41+
final Validator<Object?> v = required(null, customMsg);
42+
final Validator<int?> v1 = required(isMultipleBy6, customMsg);
4343

4444
expect(v(null), equals(customMsg));
4545
expect(v(''), equals(customMsg));

0 commit comments

Comments
 (0)