1
- import 'package:after_init/after_init.dart' ;
2
1
import 'package:flutter/material.dart' ;
3
2
import 'package:flutter/scheduler.dart' ;
4
3
import 'package:flutter_form_builder/flutter_form_builder.dart' ;
@@ -76,20 +75,21 @@ abstract class FormBuilderField<T> extends FormField<T> {
76
75
FormFieldState <T > createState ();
77
76
}
78
77
79
- class FormBuilderFieldState <F extends FormBuilderField <T >, T >
80
- extends FormFieldState <T > with AfterInitMixin {
78
+ abstract class FormBuilderFieldState <F extends FormBuilderField <T >, T >
79
+ extends FormFieldState <T > {
81
80
@override
82
- F get widget => super .widget as F ;
81
+ F get widget => super .widget;
83
82
84
83
FormBuilderState get formState => _formBuilderState;
85
84
86
- bool get readOnly => _formBuilderState? .readOnly == true || widget.readOnly ;
85
+ bool get readOnly => widget.readOnly || _formBuilderState? .readOnly == true ;
87
86
87
+ /// Returns the initial value, which may be declared at the field, or by the
88
+ /// parent [FormBuilder.initialValue] . When declared at both levels, the field
89
+ /// initialValue prevails.
88
90
T get initialValue =>
89
91
widget.initialValue ??
90
- ((_formBuilderState? .initialValue? .containsKey (widget.name) ?? false )
91
- ? _formBuilderState.initialValue[widget.name]
92
- : null );
92
+ (_formBuilderState? .initialValue ?? const {})[widget.name];
93
93
94
94
FormBuilderState _formBuilderState;
95
95
@@ -103,17 +103,32 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
103
103
104
104
FocusNode _focusNode;
105
105
106
- FocusNode get effectiveFocusNode =>
107
- widget.focusNode ?? (_focusNode ?? = FocusNode ());
106
+ FocusNode get effectiveFocusNode => _focusNode;
108
107
109
108
@override
110
- void didInitState () {
109
+ void initState () {
110
+ super .initState ();
111
+ // Register this field when there is a parent FormBuilder
111
112
_formBuilderState = FormBuilder .of (context);
112
113
_formBuilderState? .registerField (widget.name, this );
113
- effectiveFocusNode.addListener (setTouchedHandler);
114
+ // Register a touch handler
115
+ _focusNode = widget.focusNode ?? FocusNode ();
116
+ _focusNode.addListener (_touchedHandler);
117
+ // Set the initial value
114
118
setValue (initialValue);
115
119
}
116
120
121
+ @override
122
+ void dispose () {
123
+ _focusNode.removeListener (_touchedHandler);
124
+ // Dispose focus node when created by initState
125
+ if (null == widget.focusNode) {
126
+ _focusNode.dispose ();
127
+ }
128
+ _formBuilderState? .unregisterField (widget.name);
129
+ super .dispose ();
130
+ }
131
+
117
132
@override
118
133
void save () {
119
134
super .save ();
@@ -131,10 +146,9 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
131
146
}
132
147
}
133
148
134
- void setTouchedHandler () {
135
- if (effectiveFocusNode .hasFocus && _touched == false ) {
149
+ void _touchedHandler () {
150
+ if (_focusNode .hasFocus && _touched == false ) {
136
151
setState (() => _touched = true );
137
- print ('${widget .name } touched' );
138
152
}
139
153
}
140
154
@@ -160,15 +174,6 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
160
174
FocusScope .of (context).requestFocus (effectiveFocusNode);
161
175
}
162
176
163
- @override
164
- void dispose () {
165
- effectiveFocusNode.removeListener (setTouchedHandler);
166
- _formBuilderState? .unregisterField (widget.name);
167
- // The attachment will automatically be detached in dispose().
168
- _focusNode? .dispose ();
169
- super .dispose ();
170
- }
171
-
172
177
void patchValue (T value) {
173
178
didChange (value);
174
179
}
0 commit comments