setValue<T> method
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);
}