group method

FormGroup group(
  1. Map<String, Object> controls, [
  2. List<ValidatorFunction> validators = const [],
  3. List<AsyncValidatorFunction> 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<ValidatorFunction> validators = const [],
  List<AsyncValidatorFunction> asyncValidators = const [],
]) {
  final map = controls
      .map<String, AbstractControl<Object>>((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<Object>) {
      return MapEntry(key, value);
    } else if (value is ValidatorFunction) {
      return MapEntry(key, FormControl(validators: [value]));
    } else if (value is List<ValidatorFunction>) {
      return MapEntry(key, FormControl(validators: value));
    } else if (value is List<Object?>) {
      if (value.isEmpty) {
        return MapEntry(key, FormControl());
      } else {
        final defaultValue = value.first;
        final validators = List.of(value.skip(1));

        if (validators.isNotEmpty &&
            validators.any((validator) => validator is! ValidatorFunction)) {
          throw FormBuilderInvalidInitializationException(
              'Invalid validators initialization');
        }

        if (defaultValue is ValidatorFunction) {
          throw FormBuilderInvalidInitializationException(
              'Expected first value in array to be default value of the control and not a validator.');
        }

        final effectiveValidators = validators
            // TODO handling should be optimized
            // ignore: cast_nullable_to_non_nullable
            .map<ValidatorFunction>((v) => v as ValidatorFunction)
            .toList();
        final control = _control(defaultValue, effectiveValidators);
        return MapEntry(key, control as AbstractControl<Object>);
      }
    }

    return MapEntry(key, FormControl(value: value));
  });

  return FormGroup(
    map,
    validators: validators,
    asyncValidators: asyncValidators,
  );
}