@@ -117,9 +117,8 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
117
117
118
118
bool get enabled => widget.enabled && (_formBuilderState? .enabled ?? true );
119
119
120
- FocusNode ? _focusNode;
121
- FocusNode get effectiveFocusNode =>
122
- widget.focusNode ?? (_focusNode ?? = FocusNode ());
120
+ bool get _ownsFocusNode => widget.focusNode == null ;
121
+ late FocusNode effectiveFocusNode;
123
122
124
123
@override
125
124
void initState () {
@@ -128,14 +127,30 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
128
127
_formBuilderState = FormBuilder .of (context);
129
128
// Set the initial value
130
129
_formBuilderState? .registerField (widget.name, this );
130
+
131
+ effectiveFocusNode = widget.focusNode ?? FocusNode ();
131
132
// Register a touch handler
132
133
effectiveFocusNode.addListener (_touchedHandler);
133
134
}
134
135
136
+ @override
137
+ void didUpdateWidget (covariant FormBuilderField <T > oldWidget) {
138
+ super .didUpdateWidget (oldWidget);
139
+ if (widget.focusNode != oldWidget.focusNode) {
140
+ effectiveFocusNode.removeListener (_touchedHandler);
141
+ if (oldWidget.focusNode == null ) {
142
+ effectiveFocusNode.dispose ();
143
+ }
144
+ effectiveFocusNode = widget.focusNode ?? FocusNode ();
145
+ }
146
+ }
147
+
135
148
@override
136
149
void dispose () {
137
- _focusNode? .removeListener (_touchedHandler);
138
- _focusNode? .dispose ();
150
+ effectiveFocusNode.removeListener (_touchedHandler);
151
+ if (_ownsFocusNode) {
152
+ effectiveFocusNode.dispose ();
153
+ }
139
154
_formBuilderState? .unregisterField (widget.name, this );
140
155
super .dispose ();
141
156
}
@@ -156,7 +171,6 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
156
171
_formBuilderState! .setInternalFieldValue <T >(
157
172
widget.name,
158
173
value,
159
- transformer: widget.valueTransformer,
160
174
isSetState: isSetState,
161
175
);
162
176
} else {
@@ -169,7 +183,7 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
169
183
}
170
184
171
185
void _touchedHandler () {
172
- if (_focusNode ! .hasFocus && _touched == false ) {
186
+ if (effectiveFocusNode .hasFocus && _touched == false ) {
173
187
setState (() => _touched = true );
174
188
}
175
189
}
0 commit comments