Skip to content

Commit 9d3ff79

Browse files
committed
fixed _transformers
1 parent 8b5c8b2 commit 9d3ff79

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

packages/flutter_form_builder/lib/src/form_builder.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,9 @@ class FormBuilderState extends State<FormBuilder> {
127127
void setInternalFieldValue<T>(
128128
String name,
129129
T? value, {
130-
required dynamic Function(T?)? transformer,
131130
required bool isSetState,
132131
}) {
133132
_instantValue[name] = value;
134-
135-
if (transformer != null) {
136-
_transformers[name] = (val) => transformer(val as T?);
137-
}
138133
if (isSetState) {
139134
setState(() {});
140135
}
@@ -167,6 +162,10 @@ class FormBuilderState extends State<FormBuilder> {
167162
}());
168163

169164
_fields[name] = field;
165+
if (field.widget.valueTransformer != null) {
166+
_transformers[name] =
167+
(value) => field.widget.valueTransformer?.call(value);
168+
}
170169
if (oldField != null) {
171170
// ignore: invalid_use_of_protected_member
172171
field.setValue(
@@ -190,6 +189,7 @@ class FormBuilderState extends State<FormBuilder> {
190189
// since it may be intentional.
191190
if (field == _fields[name]) {
192191
_fields.remove(name);
192+
_transformers.remove(name);
193193
} else {
194194
assert(() {
195195
// This is OK to ignore when you are intentionally replacing a field

packages/flutter_form_builder/lib/src/form_builder_field.dart

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,8 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
117117

118118
bool get enabled => widget.enabled && (_formBuilderState?.enabled ?? true);
119119

120-
FocusNode? _focusNode;
121-
FocusNode get effectiveFocusNode =>
122-
widget.focusNode ?? (_focusNode ??= FocusNode());
120+
bool get _ownsFocusNode => widget.focusNode == null;
121+
late FocusNode effectiveFocusNode;
123122

124123
@override
125124
void initState() {
@@ -128,14 +127,30 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
128127
_formBuilderState = FormBuilder.of(context);
129128
// Set the initial value
130129
_formBuilderState?.registerField(widget.name, this);
130+
131+
effectiveFocusNode = widget.focusNode ?? FocusNode();
131132
// Register a touch handler
132133
effectiveFocusNode.addListener(_touchedHandler);
133134
}
134135

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+
135148
@override
136149
void dispose() {
137-
_focusNode?.removeListener(_touchedHandler);
138-
_focusNode?.dispose();
150+
effectiveFocusNode.removeListener(_touchedHandler);
151+
if (_ownsFocusNode) {
152+
effectiveFocusNode.dispose();
153+
}
139154
_formBuilderState?.unregisterField(widget.name, this);
140155
super.dispose();
141156
}
@@ -156,7 +171,6 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
156171
_formBuilderState!.setInternalFieldValue<T>(
157172
widget.name,
158173
value,
159-
transformer: widget.valueTransformer,
160174
isSetState: isSetState,
161175
);
162176
} else {
@@ -169,7 +183,7 @@ class FormBuilderFieldState<F extends FormBuilderField<T>, T>
169183
}
170184

171185
void _touchedHandler() {
172-
if (_focusNode!.hasFocus && _touched == false) {
186+
if (effectiveFocusNode.hasFocus && _touched == false) {
173187
setState(() => _touched = true);
174188
}
175189
}

0 commit comments

Comments
 (0)