Skip to content

Commit 7019dcc

Browse files
fix: improve focus fields on validation
1 parent 93507c0 commit 7019dcc

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

lib/src/form_builder.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:flutter/widgets.dart';
2-
import 'package:flutter_form_builder/src/extensions/autovalidatemode_extension.dart';
32
import 'package:flutter_form_builder/flutter_form_builder.dart';
43

54
/// A container for form fields.
@@ -107,6 +106,12 @@ class FormBuilderState extends State<FormBuilder> {
107106
final Map<String, dynamic> _savedValue = {};
108107
// Because dart type system will not accept ValueTransformer<dynamic>
109108
final Map<String, Function> _transformers = {};
109+
bool _focusOnInvalid = true;
110+
111+
/// Will be true if will focus on invalid field when validate
112+
///
113+
/// Only used to internal logic
114+
bool get focusOnInvalid => _focusOnInvalid;
110115

111116
bool get enabled => widget.enabled;
112117

@@ -161,9 +166,6 @@ class FormBuilderState extends State<FormBuilder> {
161166

162167
void setInternalFieldValue<T>(String name, T? value) {
163168
_instantValue[name] = value;
164-
if (widget.autovalidateMode?.isEnable ?? false) {
165-
validate();
166-
}
167169
widget.onChanged?.call();
168170
}
169171

@@ -253,6 +255,7 @@ class FormBuilderState extends State<FormBuilder> {
253255
bool focusOnInvalid = true,
254256
bool autoScrollWhenFocusOnInvalid = false,
255257
}) {
258+
_focusOnInvalid = focusOnInvalid;
256259
final hasError = !_formKey.currentState!.validate();
257260
if (hasError) {
258261
final wrongFields =

lib/src/form_builder_field.dart

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,6 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
101101

102102
bool get enabled => widget.enabled && (_formBuilderState?.enabled ?? true);
103103
bool get readOnly => !(_formBuilderState?.widget.skipDisabled ?? false);
104-
bool get _isEnableValidate =>
105-
widget.autovalidateMode.isEnable ||
106-
(_formBuilderState?.widget.autovalidateMode?.isEnable ?? false);
107104
bool get _isAlwaysValidate =>
108105
widget.autovalidateMode.isAlways ||
109106
(_formBuilderState?.widget.autovalidateMode?.isAlways ?? false);
@@ -178,7 +175,6 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
178175
_dirty = true;
179176
if (enabled || readOnly) {
180177
_formBuilderState!.setInternalFieldValue<T>(widget.name, value);
181-
if (_isEnableValidate) validate();
182178
return;
183179
}
184180
_formBuilderState!.removeInternalFieldValue(widget.name);
@@ -243,7 +239,14 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
243239
}
244240
final isValid = super.validate() && !hasError;
245241

246-
if (!isValid && focusOnInvalid && enabled) {
242+
final fields = _formBuilderState?.fields ??
243+
<String, FormBuilderFieldState<FormBuilderField<dynamic>, dynamic>>{};
244+
245+
if (!isValid &&
246+
focusOnInvalid &&
247+
(formState?.focusOnInvalid ?? true) &&
248+
enabled &&
249+
!fields.values.any((e) => e.effectiveFocusNode.hasFocus)) {
247250
focus();
248251
if (autoScrollWhenFocusOnInvalid) ensureScrollableVisibility();
249252
}

0 commit comments

Comments
 (0)