@@ -86,20 +86,62 @@ class FormBuilderState extends State<FormBuilder> {
86
86
87
87
final _fields = < String , FormBuilderFieldState > {};
88
88
89
- final _value = < String , dynamic > {};
89
+ final _transformers = < String , dynamic Function (Object ? )> {};
90
+ final _instantValue = < String , dynamic > {};
91
+ final _savedValue = < String , dynamic > {};
90
92
91
- Map <String , dynamic > get value => Map <String , dynamic >.unmodifiable (_value);
93
+ Map <String , dynamic > get instantValue =>
94
+ Map <String , dynamic >.unmodifiable (_instantValue.map ((key, value) =>
95
+ MapEntry (key, _transformers[key]? .call (value) ?? value)));
92
96
97
+ /// Returns the saved value only
98
+ Map <String , dynamic > get value =>
99
+ Map <String , dynamic >.unmodifiable (_savedValue.map ((key, value) =>
100
+ MapEntry (key, _transformers[key]? .call (value) ?? value)));
101
+
102
+ /// Returns values after saving
93
103
Map <String , dynamic > get initialValue => widget.initialValue;
94
104
95
105
Map <String , FormBuilderFieldState > get fields => _fields;
96
106
97
- void setInternalFieldValue (String name, dynamic value) {
98
- setState (() => _value[name] = value);
107
+ dynamic transformValue <T >(String name, T ? v) {
108
+ final t = _transformers[name];
109
+ return t != null ? t.call (v) : v;
110
+ }
111
+
112
+ dynamic getTransformedValue <T >(String name, {bool fromSaved = false }) {
113
+ final og = fromSaved ? _savedValue[name] : _instantValue[name];
114
+ return transformValue <T >(name, og);
99
115
}
100
116
101
- void removeInternalFieldValue (String name) {
102
- setState (() => _value.remove (name));
117
+ T ? getRawValue <T >(String name, {bool fromSaved = false }) {
118
+ return fromSaved ? _savedValue[name] : _instantValue[name];
119
+ }
120
+
121
+ void setInternalFieldValue <T >(
122
+ String name,
123
+ T ? value, {
124
+ required dynamic Function (T ? )? transformer,
125
+ required bool isSetState,
126
+ }) {
127
+ _instantValue[name] = value;
128
+
129
+ if (transformer != null ) {
130
+ _transformers[name] = (val) => transformer (val as T ? );
131
+ }
132
+ if (isSetState) {
133
+ setState (() {});
134
+ }
135
+ }
136
+
137
+ void removeInternalFieldValue (
138
+ String name, {
139
+ required bool isSetState,
140
+ }) {
141
+ _instantValue.remove (name);
142
+ if (isSetState) {
143
+ setState (() {});
144
+ }
103
145
}
104
146
105
147
void registerField (String name, FormBuilderFieldState field) {
@@ -121,30 +163,26 @@ class FormBuilderState extends State<FormBuilder> {
121
163
_fields[name] = field;
122
164
if (oldField != null ) {
123
165
// ignore: invalid_use_of_protected_member
124
- field.setValue (oldField.value);
125
- _tempFieldValues.remove (name);
166
+ field.setValue (
167
+ oldField.value,
168
+ populateForm: false ,
169
+ );
126
170
} else {
127
- final oldTemp = _tempFieldValues[name];
128
- if (oldTemp != null ) {
129
- // ignore: invalid_use_of_protected_member
130
- field.setValue (oldTemp);
131
- _tempFieldValues.remove (name);
132
- } else {
133
- // ignore: invalid_use_of_protected_member
134
- field.setValue (field.initialValue);
135
- }
171
+ // ignore: invalid_use_of_protected_member
172
+ field.setValue (
173
+ _instantValue[name] ?? field.initialValue,
174
+ populateForm: false ,
175
+ );
136
176
}
137
177
}
138
178
139
- final _tempFieldValues = < String , dynamic > {};
140
179
void unregisterField (String name, FormBuilderFieldState field) {
141
180
assert (_fields.containsKey (name));
142
181
// Only remove the field when it is the one registered. It's possible that
143
182
// the field is replaced (registerField is called twice for a given name)
144
183
// before unregisterField is called for the name, so just emit a warning
145
184
// since it may be intentional.
146
185
if (field == _fields[name]) {
147
- _tempFieldValues[name] = field.value;
148
186
_fields.remove (name);
149
187
} else {
150
188
assert (() {
@@ -156,11 +194,14 @@ class FormBuilderState extends State<FormBuilder> {
156
194
}());
157
195
}
158
196
// Removes internal field value
159
- _value .remove (name);
197
+ // _savedValue .remove(name);
160
198
}
161
199
162
200
void save () {
163
201
_formKey.currentState! .save ();
202
+ //copy values from instant to saved
203
+ _savedValue.clear ();
204
+ _savedValue.addAll (_instantValue);
164
205
}
165
206
166
207
void invalidateField ({required String name, String ? errorText}) =>
0 commit comments