Skip to content

Commit c3ebe72

Browse files
committed
Started experimenting with onChanged in formControls
1 parent 4e1a801 commit c3ebe72

File tree

3 files changed

+36
-19
lines changed

3 files changed

+36
-19
lines changed

example/lib/main.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,8 +399,13 @@ class MyHomePageState extends State<MyHomePage> {
399399
label: "Name",
400400
value: "John Doe",
401401
require: true,
402-
readonly: true,
402+
// readonly: true,
403403
min: 3,
404+
onChanged: (newVal){
405+
print(newVal);
406+
print(_fbKey.currentState.findFieldByAttribute("story").currentState.value);
407+
_fbKey.currentState.findFieldByAttribute("story").currentState.didChange(newVal);
408+
}
404409
),
405410
FormBuilderInput.dropdown(
406411
attribute: "dropdown",
@@ -423,10 +428,11 @@ class MyHomePageState extends State<MyHomePage> {
423428
type: FormBuilderInput.TYPE_MULTILINE_TEXT,
424429
attribute: "story",
425430
label: "Story",
426-
value: "John Doe",
431+
value: "Here's my story",
427432
require: false,
428433
min: 25,
429434
maxLines: 10,
435+
autovalidate: true,
430436
),
431437
FormBuilderInput.textField(
432438
type: FormBuilderInput.TYPE_EMAIL,

lib/src/form_builder.dart

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class FormBuilder extends StatefulWidget {
1616
final List<FormBuilderInput> controls;
1717
final bool readonly;
1818
final bool autovalidate;
19+
final Key key;
1920

2021
const FormBuilder(
2122
this.context, {
@@ -27,11 +28,9 @@ class FormBuilder extends StatefulWidget {
2728
this.onWillPop,
2829
}) : super(key: key);
2930

30-
final Key key;
31-
3231
// assert(duplicateAttributes(controls).length == 0, "Duplicate attribute names not allowed");
3332

34-
//TODO: Find way to assert no duplicates in control attributes
33+
//FIXME: Find way to assert no duplicates in control attributes
3534
/*Function duplicateAttributes = (List<FormBuilderInput> controls) {
3635
List<String> attributeList = [];
3736
controls.forEach((c) {
@@ -49,6 +48,7 @@ class FormBuilderState extends State<FormBuilder> {
4948
final List<FormBuilderInput> formControls;
5049
final _formKey = GlobalKey<FormState>();
5150
Map<String, dynamic> value = {};
51+
Map<String, GlobalKey<FormFieldState>> _fieldKeys = {};
5252
final _dateTimeFormats = {
5353
InputType.both: DateFormat("EEEE, MMMM d, yyyy 'at' h:mma"),
5454
InputType.date: DateFormat('yyyy-MM-dd'),
@@ -61,6 +61,10 @@ class FormBuilderState extends State<FormBuilder> {
6161
_formKey.currentState.save();
6262
}
6363

64+
GlobalKey<FormFieldState> findFieldByAttribute(String attribute){
65+
return _fieldKeys[attribute];
66+
}
67+
6468
bool validate() {
6569
return _formKey.currentState.validate();
6670
}
@@ -85,7 +89,8 @@ class FormBuilderState extends State<FormBuilder> {
8589
child: SingleChildScrollView(
8690
child: Column(
8791
children: this.formControls.map((FormBuilderInput formControl) {
88-
// FormBuilderInput formControl = formControl;
92+
GlobalKey<FormFieldState> _fieldKey = GlobalKey(debugLabel:formControl.attribute);
93+
_fieldKeys[formControl.attribute] = _fieldKey;
8994
switch (formControl.type) {
9095
case FormBuilderInput.TYPE_TEXT:
9196
case FormBuilderInput.TYPE_PASSWORD:
@@ -116,7 +121,7 @@ class FormBuilderState extends State<FormBuilder> {
116121
break;
117122
}
118123
return TextFormField(
119-
key: Key(formControl.attribute),
124+
key: _fieldKey,
120125
enabled: !(widget.readonly || formControl.readonly),
121126
style: (widget.readonly || formControl.readonly)
122127
? Theme.of(context).textTheme.subhead.copyWith(
@@ -132,7 +137,7 @@ class FormBuilderState extends State<FormBuilder> {
132137
hintText: formControl.hint,
133138
helperText: formControl.hint,
134139
),
135-
autovalidate: formControl.autovalidate,
140+
autovalidate: formControl.autovalidate ?? false,
136141
initialValue:
137142
formControl.value != null ? "${formControl.value}" : '',
138143
maxLines:
@@ -150,6 +155,10 @@ class FormBuilderState extends State<FormBuilder> {
150155
? num.tryParse(val)
151156
: val;
152157
},
158+
onFieldSubmitted: (data){
159+
if(formControl.onChanged != null)
160+
formControl.onChanged(data);
161+
},
153162
validator: (val) {
154163
if (formControl.require && val.isEmpty)
155164
return "${formControl.label} is required";
@@ -275,7 +284,7 @@ class FormBuilderState extends State<FormBuilder> {
275284
TextEditingController _typeAheadController =
276285
TextEditingController(text: formControl.value);
277286
return TypeAheadFormField(
278-
key: Key(formControl.attribute),
287+
key: _fieldKey,
279288
textFieldConfiguration: TextFieldConfiguration(
280289
enabled: !(widget.readonly || formControl.readonly),
281290
controller: _typeAheadController,
@@ -334,7 +343,7 @@ class FormBuilderState extends State<FormBuilder> {
334343

335344
case FormBuilderInput.TYPE_DROPDOWN:
336345
return FormField(
337-
key: Key(formControl.attribute),
346+
key: _fieldKey,
338347
enabled: !(widget.readonly || formControl.readonly),
339348
initialValue: formControl.value,
340349
validator: (val) {
@@ -380,7 +389,7 @@ class FormBuilderState extends State<FormBuilder> {
380389
//TODO: For TYPE_CHECKBOX, TYPE_CHECKBOX_LIST, TYPE_RADIO allow user to choose if checkbox/radio to appear before or after Label
381390
case FormBuilderInput.TYPE_RADIO:
382391
return FormField(
383-
key: Key(formControl.attribute),
392+
key: _fieldKey,
384393
enabled: !widget.readonly && !formControl.readonly,
385394
initialValue: formControl.value,
386395
onSaved: (val) {
@@ -442,7 +451,7 @@ class FormBuilderState extends State<FormBuilder> {
442451

443452
case FormBuilderInput.TYPE_SEGMENTED_CONTROL:
444453
return FormField(
445-
key: Key(formControl.attribute),
454+
key: _fieldKey,
446455
initialValue: formControl.value,
447456
enabled: !(widget.readonly || formControl.readonly),
448457
onSaved: (val) {
@@ -503,7 +512,7 @@ class FormBuilderState extends State<FormBuilder> {
503512

504513
case FormBuilderInput.TYPE_SWITCH:
505514
return FormField(
506-
key: Key(formControl.attribute),
515+
key: _fieldKey,
507516
enabled: !(widget.readonly || formControl.readonly),
508517
initialValue: formControl.value ?? false,
509518
validator: (value) {
@@ -553,7 +562,7 @@ class FormBuilderState extends State<FormBuilder> {
553562
case FormBuilderInput.TYPE_STEPPER:
554563
return FormField(
555564
enabled: !(widget.readonly || formControl.readonly),
556-
key: Key(formControl.attribute),
565+
key: _fieldKey,
557566
initialValue: formControl.value,
558567
validator: (value) {
559568
if (formControl.require && value == null)
@@ -592,7 +601,7 @@ class FormBuilderState extends State<FormBuilder> {
592601
case FormBuilderInput.TYPE_RATE:
593602
return FormField(
594603
enabled: !(widget.readonly || formControl.readonly),
595-
key: Key(formControl.attribute),
604+
key: _fieldKey,
596605
initialValue: formControl.value ?? 1,
597606
validator: (value) {
598607
if (formControl.require && value == null)
@@ -630,7 +639,7 @@ class FormBuilderState extends State<FormBuilder> {
630639

631640
case FormBuilderInput.TYPE_CHECKBOX:
632641
return FormField(
633-
key: Key(formControl.attribute),
642+
key: _fieldKey,
634643
enabled: !(widget.readonly || formControl.readonly),
635644
initialValue: formControl.value ?? false,
636645
validator: (value) {
@@ -680,7 +689,7 @@ class FormBuilderState extends State<FormBuilder> {
680689

681690
case FormBuilderInput.TYPE_SLIDER:
682691
return FormField(
683-
key: Key(formControl.attribute),
692+
key: _fieldKey,
684693
enabled: !(widget.readonly || formControl.readonly),
685694
initialValue: formControl.value,
686695
validator: (value) {
@@ -735,7 +744,7 @@ class FormBuilderState extends State<FormBuilder> {
735744

736745
case FormBuilderInput.TYPE_CHECKBOX_LIST:
737746
return FormField(
738-
key: Key(formControl.attribute),
747+
key: _fieldKey,
739748
enabled: !(widget.readonly || formControl.readonly),
740749
initialValue: formControl.value ?? [],
741750
onSaved: (val) {
@@ -808,7 +817,7 @@ class FormBuilderState extends State<FormBuilder> {
808817
return SizedBox(
809818
// height: 200.0,
810819
child: FormField(
811-
key: Key(formControl.attribute),
820+
key: _fieldKey,
812821
enabled: !(widget.readonly || formControl.readonly),
813822
initialValue: formControl.value ?? [],
814823
onSaved: (val) {

lib/src/form_builder_input.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class FormBuilderInput {
5656
ChipsBuilder chipBuilder;
5757
int maxLines;
5858
bool autovalidate;
59+
ValueChanged<dynamic> onChanged;
5960

6061
//Inputs for typeahead
6162
bool getImmediateSuggestions;
@@ -88,6 +89,7 @@ class FormBuilderInput {
8889
this.max,
8990
this.maxLines = 5,
9091
this.autovalidate = false,
92+
this.onChanged,
9193
}) : assert(min == null || min is int),
9294
assert(max == null || max is int);
9395

0 commit comments

Comments
 (0)