Fix disabled formfield validation (#23167)
* Fix form field validate method being called if form field is disabled
This commit is contained in:
parent
d556d2117d
commit
fd02bdf1b5
@ -71,7 +71,7 @@ class TextFormField extends FormField<String> {
|
|||||||
FormFieldSetter<String> onSaved,
|
FormFieldSetter<String> onSaved,
|
||||||
FormFieldValidator<String> validator,
|
FormFieldValidator<String> validator,
|
||||||
List<TextInputFormatter> inputFormatters,
|
List<TextInputFormatter> inputFormatters,
|
||||||
bool enabled,
|
bool enabled = true,
|
||||||
Brightness keyboardAppearance,
|
Brightness keyboardAppearance,
|
||||||
EdgeInsets scrollPadding = const EdgeInsets.all(20.0),
|
EdgeInsets scrollPadding = const EdgeInsets.all(20.0),
|
||||||
}) : assert(initialValue == null || controller == null),
|
}) : assert(initialValue == null || controller == null),
|
||||||
@ -90,6 +90,7 @@ class TextFormField extends FormField<String> {
|
|||||||
onSaved: onSaved,
|
onSaved: onSaved,
|
||||||
validator: validator,
|
validator: validator,
|
||||||
autovalidate: autovalidate,
|
autovalidate: autovalidate,
|
||||||
|
enabled: enabled,
|
||||||
builder: (FormFieldState<String> field) {
|
builder: (FormFieldState<String> field) {
|
||||||
final _TextFormFieldState state = field;
|
final _TextFormFieldState state = field;
|
||||||
final InputDecoration effectiveDecoration = (decoration ?? const InputDecoration())
|
final InputDecoration effectiveDecoration = (decoration ?? const InputDecoration())
|
||||||
|
@ -227,6 +227,7 @@ class FormField<T> extends StatefulWidget {
|
|||||||
this.validator,
|
this.validator,
|
||||||
this.initialValue,
|
this.initialValue,
|
||||||
this.autovalidate = false,
|
this.autovalidate = false,
|
||||||
|
this.enabled = true,
|
||||||
}) : assert(builder != null),
|
}) : assert(builder != null),
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
@ -256,6 +257,13 @@ class FormField<T> extends StatefulWidget {
|
|||||||
/// autovalidates, this value will be ignored.
|
/// autovalidates, this value will be ignored.
|
||||||
final bool autovalidate;
|
final bool autovalidate;
|
||||||
|
|
||||||
|
/// Whether the form is able to receive user input.
|
||||||
|
///
|
||||||
|
/// Defaults to true. If [autovalidate] is true, the field will be validated.
|
||||||
|
/// Likewise, if this field is false, the widget will not be validated
|
||||||
|
/// regardless of [autovalidate].
|
||||||
|
final bool enabled;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FormFieldState<T> createState() => FormFieldState<T>();
|
FormFieldState<T> createState() => FormFieldState<T>();
|
||||||
}
|
}
|
||||||
@ -344,7 +352,8 @@ class FormFieldState<T> extends State<FormField<T>> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (widget.autovalidate)
|
// Only autovalidate if the widget is also enabled
|
||||||
|
if (widget.autovalidate && widget.enabled)
|
||||||
_validate();
|
_validate();
|
||||||
Form.of(context)?._register(this);
|
Form.of(context)?._register(this);
|
||||||
return widget.builder(this);
|
return widget.builder(this);
|
||||||
|
@ -114,4 +114,52 @@ void main() {
|
|||||||
await tester.pump();
|
await tester.pump();
|
||||||
expect(_validateCalled, 2);
|
expect(_validateCalled, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('validate is not called if widget is disabled', (WidgetTester tester) async {
|
||||||
|
int _validateCalled = 0;
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: Material(
|
||||||
|
child: Center(
|
||||||
|
child: TextFormField(
|
||||||
|
enabled: false,
|
||||||
|
autovalidate: true,
|
||||||
|
validator: (String value) { _validateCalled += 1; return null; },
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(_validateCalled, 0);
|
||||||
|
await tester.showKeyboard(find.byType(TextField));
|
||||||
|
await tester.enterText(find.byType(TextField), 'a');
|
||||||
|
await tester.pump();
|
||||||
|
expect(_validateCalled, 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('validate is called if widget is enabled', (WidgetTester tester) async {
|
||||||
|
int _validateCalled = 0;
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: Material(
|
||||||
|
child: Center(
|
||||||
|
child: TextFormField(
|
||||||
|
enabled: true,
|
||||||
|
autovalidate: true,
|
||||||
|
validator: (String value) { _validateCalled += 1; return null; },
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(_validateCalled, 1);
|
||||||
|
await tester.showKeyboard(find.byType(TextField));
|
||||||
|
await tester.enterText(find.byType(TextField), 'a');
|
||||||
|
await tester.pump();
|
||||||
|
expect(_validateCalled, 2);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user