Skip to content

Commit 61810e8

Browse files
Merge pull request #1096 from flutter-form-builder-ecosystem/977
Clear customError on reset
2 parents 0b9c8a4 + ccf1e84 commit 61810e8

File tree

4 files changed

+64
-13
lines changed

4 files changed

+64
-13
lines changed

README.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,29 +172,30 @@ FormBuilder(
172172
child: Column(
173173
children: [
174174
FormBuilderTextField(
175-
key: _emailFieldKey
175+
key: _emailFieldKey,
176176
name: 'email',
177-
decoration: InputDecoration(labelText: 'Email'),
177+
decoration: const InputDecoration(labelText: 'Email'),
178178
validator: FormBuilderValidators.compose([
179179
FormBuilderValidators.required(),
180180
FormBuilderValidators.email(),
181181
]),
182182
),
183-
RaisedButton(
184-
child: Text('Submit'),
183+
ElevatedButton(
184+
child: const Text('Submit'),
185185
onPressed: () async {
186186
if(await checkIfEmailExists()){
187187
// Either invalidate using Form Key
188-
_formKey.currentState?.invalidateField(name: 'email', errorText: 'Email already taken.');
188+
_formKey.currentState?.invalidateField(
189+
name: 'email', errorText: 'Email already taken.');
189190
// OR invalidate using Field Key
190-
_emailFieldKey.currentState?.invalidate('Email already taken');
191+
_emailFieldKey.currentState
192+
?.invalidate('Email already taken');
191193
}
192194
},
193195
),
194196
],
195197
),
196198
),
197-
198199
```
199200

200201
##### Option 2 - Using InputDecoration.errorText

lib/src/form_builder_field.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,9 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
212212
void reset() {
213213
super.reset();
214214
setValue(initialValue);
215+
if (_customErrorText != null) {
216+
setState(() => _customErrorText = null);
217+
}
215218
widget.onReset?.call();
216219
}
217220

test/form_builder_tester.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_form_builder/flutter_form_builder.dart';
33

4-
final _formKey = GlobalKey<FormBuilderState>();
4+
final formKey = GlobalKey<FormBuilderState>();
55

66
Widget buildTestableFieldWidget(
77
Widget widget, {
@@ -11,7 +11,7 @@ Widget buildTestableFieldWidget(
1111
return MaterialApp(
1212
home: Scaffold(
1313
body: FormBuilder(
14-
key: _formKey,
14+
key: formKey,
1515
initialValue: initialValue,
1616
clearValueOnUnregister: clearValueOnUnregister,
1717
child: widget,
@@ -20,10 +20,10 @@ Widget buildTestableFieldWidget(
2020
);
2121
}
2222

23-
bool formSave() => _formKey.currentState!.saveAndValidate();
23+
bool formSave() => formKey.currentState!.saveAndValidate();
2424
void formFieldDidChange(String fieldName, dynamic value) {
25-
_formKey.currentState!.fields[fieldName]!.didChange(value);
25+
formKey.currentState!.fields[fieldName]!.didChange(value);
2626
}
2727

28-
T formValue<T>(String name) => _formKey.currentState!.value[name];
29-
T formInstantValue<T>(String name) => _formKey.currentState!.instantValue[name];
28+
T formValue<T>(String name) => formKey.currentState!.value[name];
29+
T formInstantValue<T>(String name) => formKey.currentState!.instantValue[name];

test/src/form_builder_field_test.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_form_builder/flutter_form_builder.dart';
3+
import 'package:flutter_test/flutter_test.dart';
4+
5+
import '../form_builder_tester.dart';
6+
7+
void main() {
8+
group('Form Builder Field -', () {
9+
testWidgets('Reset custom error from form builder', (tester) async {
10+
const textFieldName = 'text1';
11+
const errorTextField = 'error text field';
12+
final testWidget = FormBuilderTextField(name: textFieldName);
13+
await tester.pumpWidget(buildTestableFieldWidget(testWidget));
14+
15+
// Set custom error
16+
formKey.currentState
17+
?.invalidateField(name: textFieldName, errorText: errorTextField);
18+
await tester.pumpAndSettle();
19+
expect(find.text(errorTextField), findsOneWidget);
20+
21+
// Reset custom error
22+
formKey.currentState?.reset();
23+
await tester.pumpAndSettle();
24+
expect(find.text(errorTextField), findsNothing);
25+
});
26+
testWidgets('Reset custom error from form builder field', (tester) async {
27+
final textFieldKey = GlobalKey<FormBuilderFieldState>();
28+
const textFieldName = 'text2';
29+
const errorTextField = 'error text field';
30+
final testWidget = FormBuilderTextField(
31+
name: textFieldName,
32+
key: textFieldKey,
33+
);
34+
await tester.pumpWidget(buildTestableFieldWidget(testWidget));
35+
36+
// Set custom error
37+
textFieldKey.currentState?.invalidate(errorTextField);
38+
await tester.pumpAndSettle();
39+
expect(find.text(errorTextField), findsOneWidget);
40+
41+
// Reset custom error
42+
textFieldKey.currentState?.reset();
43+
await tester.pumpAndSettle();
44+
expect(find.text(errorTextField), findsNothing);
45+
});
46+
});
47+
}

0 commit comments

Comments
 (0)