group method
Construct a new FormGroup instance.
The controls argument must not be null.
Can optionally provide a validators collection for the group.
Example:
Creates a group with a control that has a default value.
final form = fb.group({
'name': 'John Doe',
});
Creates a group with a control that has a default value.
final form = fb.group({
'name': ['John Doe'],
});
Creates a group with a control that has a default value and a validator.
final form = fb.group({
'name': ['John Doe', Validators.required],
});
Creates a group with a control that has a validator.
final form = fb.group({
'name': Validators.required,
});
Creates a group with a control that has several validators.
final form = fb.group({
'email': [Validators.required, Validators.email],
});
Creates a group with a group's validator.
final form = fb.group({
'email': ['', Validators.required, Validators.email],
'emailConfirmation': '',
},
[Validators.mustMatch('email', 'emailConfirmation')],
);
Implementation
FormGroup group(
Map<String, Object> controls, [
List<Validator<dynamic>> validators = const [],
List<AsyncValidator<dynamic>> asyncValidators = const [],
]) {
final map = controls.map<String, AbstractControl<dynamic>>((
String key,
Object value,
) {
if (value is String) {
return MapEntry(key, FormControl<String>(value: value));
} else if (value is int) {
return MapEntry(key, FormControl<int>(value: value));
} else if (value is bool) {
return MapEntry(key, FormControl<bool>(value: value));
} else if (value is double) {
return MapEntry(key, FormControl<double>(value: value));
} else if (value is DateTime) {
return MapEntry(key, FormControl<DateTime>(value: value));
} else if (value is TimeOfDay) {
return MapEntry(key, FormControl<TimeOfDay>(value: value));
} else if (value is AbstractControl<dynamic>) {
return MapEntry(key, value);
} else if (value is Validator<dynamic>) {
return MapEntry(key, FormControl<dynamic>(validators: [value]));
} else if (value is List<Validator<dynamic>>) {
return MapEntry(key, FormControl<dynamic>(validators: value));
} else if (value is List<Object?>) {
if (value.isEmpty) {
return MapEntry(key, FormControl<dynamic>());
} else {
final defaultValue = value.first;
final validators = List.of(value.skip(1));
if (validators.isNotEmpty &&
validators.any((validator) => validator is! Validator<dynamic>)) {
throw FormBuilderInvalidInitializationException(
'Invalid validators initialization',
);
}
if (defaultValue is Validator<dynamic>) {
throw FormBuilderInvalidInitializationException(
'Expected first value in array to be default value of the control and not a validator.',
);
}
final effectiveValidators =
validators
.map<Validator<dynamic>>((v) => v! as Validator<dynamic>)
.toList();
return MapEntry(key, _control(defaultValue, effectiveValidators));
}
}
return MapEntry(key, FormControl<dynamic>(value: value));
});
return FormGroup(
map,
validators: validators,
asyncValidators: asyncValidators,
);
}