Skip to content

Commit 6e6baa2

Browse files
committed
Deregister field key when corresponding widget is removed from widget tree
1 parent e6f11fa commit 6e6baa2

19 files changed

+145
-116
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## [3.0.0-beta.10] - 20-April-2019
2+
* Unregister field from `Formbuilder` when its dispose method is called. Avoids assertion fail when re-added back to the widget tree
3+
14
## [3.0.0-beta.9] - 15-April-2019
25
* Added property `fields` to FormBuilder, gives access to the current state of each field through a Map of `GlobalKey<FormFieldState<dynamic>>`s.
36
This gives us access to the underlying FormField which in turn allows us:

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -292,12 +292,13 @@ FormBuilderTextField(
292292

293293
## CREDITS
294294
This package is dependent on the following packages and plugins:
295-
* [flutter_typeahead](https://pub.dartlang.org/packages/flutter_typeahead) by [https://github.com/AbdulRahmanAlHamali](https://github.com/AbdulRahmanAlHamali)
296-
* [sy_flutter_widgets]((https://pub.dartlang.org/packages/sy_flutter_widgets)) by [Li Shuhao](https://github.com/lishuhao)
295+
* [flutter_typeahead](https://pub.dartlang.org/packages/flutter_typeahead) by [AbdulRahmanAlHamali](https://github.com/AbdulRahmanAlHamali)
296+
* [sy_flutter_widgets](https://pub.dartlang.org/packages/sy_flutter_widgets) by [Li Shuhao](https://github.com/lishuhao)
297297
* [datetime_picker_formfield](https://pub.dartlang.org/packages/datetime_picker_formfield) by [Jacob Phillips](https://github.com/jifalops)
298-
* [flutter_chips_input](https://pub.dartlang.org/packages/flutter_chips_input) by [Yours trully :)](https://github.com/danvick)
299-
* [intl](https://pub.dartlang.org/packages/intl)
298+
* [validators](https://pub.dartlang.org/packages/validators) by [dart-league](https://github.com/dart-league)
299+
* [intl](https://pub.dartlang.org/packages/intl) - Dart Package
300300
* The SignaturePad is based on [signature](https://pub.dartlang.org/packages/signature) by [4Q s.r.o.](https://github.com/4Q-s-r-o) with some minor improvements to fit our usage
301+
* [flutter_chips_input](https://pub.dartlang.org/packages/flutter_chips_input) by [Yours trully :)](https://github.com/danvick)
301302

302303
## TODO:
303304
### Improvements

lib/src/fields/form_builder_checkbox.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,20 @@ class FormBuilderCheckbox extends StatefulWidget {
3131
class _FormBuilderCheckboxState extends State<FormBuilderCheckbox> {
3232
bool _readonly = false;
3333
final GlobalKey<FormFieldState> _fieldKey = GlobalKey<FormFieldState>();
34+
FormBuilderState _formState;
3435

3536
@override
3637
void initState() {
37-
registerFieldKey();
38-
_readonly =
39-
(FormBuilder.of(context)?.readonly == true) ? true : widget.readonly;
38+
_formState = FormBuilder.of(context);
39+
_formState?.registerFieldKey(widget.attribute, _fieldKey);
40+
_readonly = (_formState?.readonly == true) ? true : widget.readonly;
4041
super.initState();
4142
}
4243

43-
registerFieldKey() {
44-
if (FormBuilder.of(context) != null)
45-
FormBuilder.of(context).registerFieldKey(widget.attribute, _fieldKey);
44+
@override
45+
void dispose() {
46+
_formState?.unregisterFieldKey(widget.attribute);
47+
super.dispose();
4648
}
4749

4850
@override
@@ -63,7 +65,7 @@ class _FormBuilderCheckboxState extends State<FormBuilderCheckbox> {
6365
FormBuilder.of(context)
6466
?.setAttributeValue(widget.attribute, transformed);
6567
} else
66-
FormBuilder.of(context)?.setAttributeValue(widget.attribute, val);
68+
_formState?.setAttributeValue(widget.attribute, val);
6769
},
6870
builder: (FormFieldState<dynamic> field) {
6971
return InputDecorator(

lib/src/fields/form_builder_checkbox_list.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,20 @@ class FormBuilderCheckboxList extends StatefulWidget {
3232
class _FormBuilderCheckboxListState extends State<FormBuilderCheckboxList> {
3333
bool _readonly = false;
3434
final GlobalKey<FormFieldState> _fieldKey = GlobalKey<FormFieldState>();
35+
FormBuilderState _formState;
3536

3637
@override
3738
void initState() {
38-
registerFieldKey();
39-
_readonly =
40-
(FormBuilder.of(context)?.readonly == true) ? true : widget.readonly;
39+
_formState = FormBuilder.of(context);
40+
_formState?.registerFieldKey(widget.attribute, _fieldKey);
41+
_readonly = (_formState?.readonly == true) ? true : widget.readonly;
4142
super.initState();
4243
}
4344

44-
registerFieldKey() {
45-
if (FormBuilder.of(context) != null)
46-
FormBuilder.of(context).registerFieldKey(widget.attribute, _fieldKey);
45+
@override
46+
void dispose() {
47+
_formState?.unregisterFieldKey(widget.attribute);
48+
super.dispose();
4749
}
4850

4951
@override
@@ -64,7 +66,7 @@ class _FormBuilderCheckboxListState extends State<FormBuilderCheckboxList> {
6466
FormBuilder.of(context)
6567
?.setAttributeValue(widget.attribute, transformed);
6668
} else
67-
FormBuilder.of(context)?.setAttributeValue(widget.attribute, val);
69+
_formState?.setAttributeValue(widget.attribute, val);
6870
},
6971
builder: (FormFieldState<dynamic> field) {
7072
List<Widget> checkboxList = [];

lib/src/fields/form_builder_chips_input.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,20 @@ class FormBuilderChipsInput<T> extends StatefulWidget {
4141
class _FormBuilderChipsInputState extends State<FormBuilderChipsInput> {
4242
bool _readonly = false;
4343
final GlobalKey<FormFieldState> _fieldKey = GlobalKey<FormFieldState>();
44+
FormBuilderState _formState;
4445

4546
@override
4647
void initState() {
47-
registerFieldKey();
48-
_readonly =
49-
(FormBuilder.of(context)?.readonly == true) ? true : widget.readonly;
48+
_formState = FormBuilder.of(context);
49+
_formState?.registerFieldKey(widget.attribute, _fieldKey);
50+
_readonly = (_formState?.readonly == true) ? true : widget.readonly;
5051
super.initState();
5152
}
5253

53-
registerFieldKey() {
54-
if (FormBuilder.of(context) != null)
55-
FormBuilder.of(context).registerFieldKey(widget.attribute, _fieldKey);
54+
@override
55+
void dispose() {
56+
_formState?.unregisterFieldKey(widget.attribute);
57+
super.dispose();
5658
}
5759

5860
@override
@@ -62,7 +64,7 @@ class _FormBuilderChipsInputState extends State<FormBuilderChipsInput> {
6264
child: FormField(
6365
key: _fieldKey,
6466
enabled: !_readonly,
65-
initialValue: widget.initialValue,
67+
initialValue: widget.initialValue ?? [],
6668
validator: (val) {
6769
for (int i = 0; i < widget.validators.length; i++) {
6870
if (widget.validators[i](val) != null)
@@ -75,7 +77,7 @@ class _FormBuilderChipsInputState extends State<FormBuilderChipsInput> {
7577
FormBuilder.of(context)
7678
?.setAttributeValue(widget.attribute, transformed);
7779
} else
78-
FormBuilder.of(context)?.setAttributeValue(widget.attribute, val);
80+
_formState?.setAttributeValue(widget.attribute, val);
7981
},
8082
builder: (FormFieldState<dynamic> field) {
8183
return ChipsInput(

lib/src/fields/form_builder_date_time_picker.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ class FormBuilderDateTimePicker extends StatefulWidget {
141141
class _FormBuilderDateTimePickerState extends State<FormBuilderDateTimePicker> {
142142
bool _readonly = false;
143143
final GlobalKey<FormFieldState> _fieldKey = GlobalKey<FormFieldState>();
144+
FormBuilderState _formState;
144145

145146
final _dateTimeFormats = {
146147
InputType.both: DateFormat("EEEE, MMMM d, yyyy 'at' h:mma"),
@@ -150,15 +151,16 @@ class _FormBuilderDateTimePickerState extends State<FormBuilderDateTimePicker> {
150151

151152
@override
152153
void initState() {
153-
registerFieldKey();
154-
_readonly =
155-
(FormBuilder.of(context)?.readonly == true) ? true : widget.readonly;
154+
_formState = FormBuilder.of(context);
155+
_formState?.registerFieldKey(widget.attribute, _fieldKey);
156+
_readonly = (_formState?.readonly == true) ? true : widget.readonly;
156157
super.initState();
157158
}
158159

159-
registerFieldKey() {
160-
if (FormBuilder.of(context) != null)
161-
FormBuilder.of(context).registerFieldKey(widget.attribute, _fieldKey);
160+
@override
161+
void dispose() {
162+
_formState?.unregisterFieldKey(widget.attribute);
163+
super.dispose();
162164
}
163165

164166
@override
@@ -182,7 +184,7 @@ class _FormBuilderDateTimePickerState extends State<FormBuilderDateTimePicker> {
182184
FormBuilder.of(context)
183185
?.setAttributeValue(widget.attribute, transformed);
184186
} else
185-
FormBuilder.of(context)?.setAttributeValue(widget.attribute, val);
187+
_formState?.setAttributeValue(widget.attribute, val);
186188
},
187189
validator: (val) {
188190
for (int i = 0; i < widget.validators.length; i++) {

lib/src/fields/form_builder_dropdown.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,20 @@ class FormBuilderDropdown extends StatefulWidget {
4545
class _FormBuilderDropdownState extends State<FormBuilderDropdown> {
4646
bool _readonly = false;
4747
final GlobalKey<FormFieldState> _fieldKey = GlobalKey<FormFieldState>();
48+
FormBuilderState _formState;
4849

4950
@override
5051
void initState() {
51-
registerFieldKey();
52-
_readonly =
53-
(FormBuilder.of(context)?.readonly == true) ? true : widget.readonly;
52+
_formState = FormBuilder.of(context);
53+
_formState?.registerFieldKey(widget.attribute, _fieldKey);
54+
_readonly = (_formState?.readonly == true) ? true : widget.readonly;
5455
super.initState();
5556
}
5657

57-
registerFieldKey() {
58-
if (FormBuilder.of(context) != null)
59-
FormBuilder.of(context).registerFieldKey(widget.attribute, _fieldKey);
58+
@override
59+
void dispose() {
60+
_formState?.unregisterFieldKey(widget.attribute);
61+
super.dispose();
6062
}
6163

6264
@override
@@ -77,7 +79,7 @@ class _FormBuilderDropdownState extends State<FormBuilderDropdown> {
7779
FormBuilder.of(context)
7880
?.setAttributeValue(widget.attribute, transformed);
7981
} else
80-
FormBuilder.of(context)?.setAttributeValue(widget.attribute, val);
82+
_formState?.setAttributeValue(widget.attribute, val);
8183
},
8284
builder: (FormFieldState<dynamic> field) {
8385
return InputDecorator(

lib/src/fields/form_builder_radio.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,20 @@ class FormBuilderRadio extends StatefulWidget {
3131
class _FormBuilderRadioState extends State<FormBuilderRadio> {
3232
bool _readonly = false;
3333
final GlobalKey<FormFieldState> _fieldKey = GlobalKey<FormFieldState>();
34+
FormBuilderState _formState;
3435

3536
@override
3637
void initState() {
37-
registerFieldKey();
38-
_readonly =
39-
(FormBuilder.of(context)?.readonly == true) ? true : widget.readonly;
38+
_formState = FormBuilder.of(context);
39+
_formState?.registerFieldKey(widget.attribute, _fieldKey);
40+
_readonly = (_formState?.readonly == true) ? true : widget.readonly;
4041
super.initState();
4142
}
4243

43-
registerFieldKey() {
44-
if (FormBuilder.of(context) != null)
45-
FormBuilder.of(context).registerFieldKey(widget.attribute, _fieldKey);
44+
@override
45+
void dispose() {
46+
_formState?.unregisterFieldKey(widget.attribute);
47+
super.dispose();
4648
}
4749

4850
@override
@@ -63,7 +65,7 @@ class _FormBuilderRadioState extends State<FormBuilderRadio> {
6365
FormBuilder.of(context)
6466
?.setAttributeValue(widget.attribute, transformed);
6567
} else
66-
FormBuilder.of(context)?.setAttributeValue(widget.attribute, val);
68+
_formState?.setAttributeValue(widget.attribute, val);
6769
},
6870
builder: (FormFieldState<dynamic> field) {
6971
List<Widget> radioList = [];

lib/src/fields/form_builder_rate.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,20 @@ class FormBuilderRate extends StatefulWidget {
3636
class _FormBuilderRateState extends State<FormBuilderRate> {
3737
bool _readonly = false;
3838
final GlobalKey<FormFieldState> _fieldKey = GlobalKey<FormFieldState>();
39+
FormBuilderState _formState;
3940

4041
@override
4142
void initState() {
42-
registerFieldKey();
43-
_readonly =
44-
(FormBuilder.of(context)?.readonly == true) ? true : widget.readonly;
43+
_formState = FormBuilder.of(context);
44+
_formState?.registerFieldKey(widget.attribute, _fieldKey);
45+
_readonly = (_formState?.readonly == true) ? true : widget.readonly;
4546
super.initState();
4647
}
4748

48-
registerFieldKey() {
49-
if (FormBuilder.of(context) != null)
50-
FormBuilder.of(context).registerFieldKey(widget.attribute, _fieldKey);
49+
@override
50+
void dispose() {
51+
_formState?.unregisterFieldKey(widget.attribute);
52+
super.dispose();
5153
}
5254

5355
@override
@@ -68,7 +70,7 @@ class _FormBuilderRateState extends State<FormBuilderRate> {
6870
FormBuilder.of(context)
6971
?.setAttributeValue(widget.attribute, transformed);
7072
} else
71-
FormBuilder.of(context)?.setAttributeValue(widget.attribute, val);
73+
_formState?.setAttributeValue(widget.attribute, val);
7274
},
7375
builder: (FormFieldState<dynamic> field) {
7476
return InputDecorator(

lib/src/fields/form_builder_segmented_control.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,20 @@ class _FormBuilderSegmentedControlState
3434
extends State<FormBuilderSegmentedControl> {
3535
bool _readonly = false;
3636
final GlobalKey<FormFieldState> _fieldKey = GlobalKey<FormFieldState>();
37+
FormBuilderState _formState;
3738

3839
@override
3940
void initState() {
40-
registerFieldKey();
41-
_readonly =
42-
(FormBuilder.of(context)?.readonly == true) ? true : widget.readonly;
41+
_formState = FormBuilder.of(context);
42+
_formState?.registerFieldKey(widget.attribute, _fieldKey);
43+
_readonly = (_formState?.readonly == true) ? true : widget.readonly;
4344
super.initState();
4445
}
4546

46-
registerFieldKey() {
47-
if (FormBuilder.of(context) != null)
48-
FormBuilder.of(context).registerFieldKey(widget.attribute, _fieldKey);
47+
@override
48+
void dispose() {
49+
_formState?.unregisterFieldKey(widget.attribute);
50+
super.dispose();
4951
}
5052

5153
@override
@@ -66,7 +68,7 @@ class _FormBuilderSegmentedControlState
6668
FormBuilder.of(context)
6769
?.setAttributeValue(widget.attribute, transformed);
6870
} else
69-
FormBuilder.of(context)?.setAttributeValue(widget.attribute, val);
71+
_formState?.setAttributeValue(widget.attribute, val);
7072
},
7173
builder: (FormFieldState<dynamic> field) {
7274
return InputDecorator(

0 commit comments

Comments
 (0)