setValue<T> method

Future<void> setValue<T>(
  1. String name,
  2. T? value
)

Implementation

Future<void> setValue<T>(String name, T? value) async {
  if (!_configs.containsKey(name)) return;

  final fieldConfig = _configs[name] as JarFieldConfig<dynamic>;
  final oldState = _fields[name] as JarFieldState<dynamic>;

  var newState = JarFieldState<T>(
    value: value,
    error: oldState.error,
    isDirty: true,
    isTouched: oldState.isTouched,
    isValidating: oldState.isValidating,
    isDisabled: oldState.isDisabled,
    name: oldState.name,
    onChange: (v) => setValue<T>(name, v),
    markAsTouched: () => markAsTouched(name),
  );

  final allValues = getValues();
  allValues[name] = value;

  final result = fieldConfig.schema.validate(value, allValues);
  newState = newState.copyWith(error: result.error);

  if (newState.error == null && fieldConfig.asyncValidators.isNotEmpty) {
    newState = newState.copyWith(isValidating: true);
    _updateField(name, newState);

    for (final validator in fieldConfig.asyncValidators) {
      try {
        final error = await validator(value);

        if (error != null) {
          newState = newState.copyWith(error: error);
          _updateField(name, newState);
          break;
        }
      } catch (e) {
        newState =
            newState.copyWith(error: 'Validation error: ${e.toString()}');
        _updateField(name, newState);
        break;
      }
    }

    if (newState.error == null) {
      newState = newState.copyWith(isValidating: false);
      _updateField(name, newState);
    }
  } else {
    _updateField(name, newState);
  }

  _notifyWatchers(name, value);

  _revalidateOtherFields(name, allValues);
}