group method

FormGroup group(
  1. Map<String, Object> controls, [
  2. List<Validator> validators = const [],
  3. List<AsyncValidator> asyncValidators = const []
])

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,
  );
}