@@ -17,48 +17,67 @@ class FormDataWidget extends ConsumerStatefulWidget {
17
17
class _FormDataBodyState extends ConsumerState <FormDataWidget > {
18
18
late int seed;
19
19
final random = Random .secure ();
20
- late List <FormDataModel > rows;
20
+ late List <FormDataModel > formRows;
21
+
21
22
@override
22
23
void initState () {
23
24
super .initState ();
24
25
seed = random.nextInt (kRandMax);
25
26
}
26
27
28
+ void _onFieldChange (String selectedId) {
29
+ ref.read (collectionStateNotifierProvider.notifier).update (
30
+ selectedId,
31
+ requestFormDataList: formRows.sublist (0 , formRows.length - 1 ),
32
+ );
33
+ }
34
+
27
35
@override
28
36
Widget build (BuildContext context) {
29
37
final selectedId = ref.watch (selectedIdStateProvider);
30
- var formRows = ref.read (selectedRequestModelProvider)? .requestFormDataList;
31
- rows =
32
- formRows == null || formRows.isEmpty ? [kFormDataEmptyModel] : formRows;
38
+ ref.watch (selectedRequestModelProvider
39
+ .select ((value) => value? .requestFormDataList? .length));
40
+ var rF = ref.read (selectedRequestModelProvider)? .requestFormDataList;
41
+ bool isFormDataEmpty = rF == null || rF.isEmpty;
42
+ List <FormDataModel > rows = (isFormDataEmpty)
43
+ ? [
44
+ kFormDataEmptyModel,
45
+ ]
46
+ : rF;
47
+ formRows = isFormDataEmpty ? rows : rows + [kFormDataEmptyModel];
33
48
34
49
DaviModel <FormDataModel > daviModelRows = DaviModel <FormDataModel >(
35
- rows: rows ,
50
+ rows: formRows ,
36
51
columns: [
37
52
DaviColumn (
38
53
cellPadding: kpsV5,
39
54
name: 'Key' ,
40
55
grow: 4 ,
41
56
cellBuilder: (_, row) {
42
57
int idx = row.index;
58
+ bool isLast = idx + 1 == formRows.length;
43
59
return Theme (
44
60
data: Theme .of (context),
45
61
child: FormDataField (
46
62
keyId: "$selectedId -$idx -form-v-$seed " ,
47
- initialValue: rows [idx].name,
63
+ initialValue: formRows [idx].name,
48
64
hintText: " Add Key" ,
49
65
onChanged: (value) {
50
- rows[idx] = rows[idx].copyWith (
51
- name: value,
52
- );
66
+ formRows[idx] = formRows[idx].copyWith (name: value);
67
+ if (isLast) formRows.add (kFormDataEmptyModel);
53
68
_onFieldChange (selectedId! );
54
69
},
55
70
colorScheme: Theme .of (context).colorScheme,
56
- formDataType: rows [idx].type,
71
+ formDataType: formRows [idx].type,
57
72
onFormDataTypeChanged: (value) {
58
- rows[idx] = rows[idx].copyWith (
73
+ bool hasChanged = formRows[idx].type != value;
74
+ formRows[idx] = formRows[idx].copyWith (
59
75
type: value ?? FormDataType .text,
60
76
);
61
- rows[idx] = rows[idx].copyWith (value: "" );
77
+ formRows[idx] = formRows[idx].copyWith (value: "" );
78
+ if (idx == formRows.length - 1 && hasChanged) {
79
+ formRows.add (kFormDataEmptyModel);
80
+ }
62
81
setState (() {});
63
82
_onFieldChange (selectedId! );
64
83
},
@@ -84,7 +103,8 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
84
103
cellPadding: kpsV5,
85
104
cellBuilder: (_, row) {
86
105
int idx = row.index;
87
- return rows[idx].type == FormDataType .file
106
+ bool isLast = idx + 1 == formRows.length;
107
+ return formRows[idx].type == FormDataType .file
88
108
? Align (
89
109
alignment: Alignment .centerLeft,
90
110
child: Row (
@@ -109,17 +129,17 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
109
129
if (pickedResult != null &&
110
130
pickedResult.files.isNotEmpty &&
111
131
pickedResult.files.first.path != null ) {
112
- rows [idx] = rows [idx].copyWith (
132
+ formRows [idx] = formRows [idx].copyWith (
113
133
value: pickedResult.files.first.path! ,
114
134
);
115
135
setState (() {});
116
136
_onFieldChange (selectedId! );
117
137
}
118
138
},
119
139
label: Text (
120
- (rows [idx].type == FormDataType .file &&
121
- rows [idx].value.isNotEmpty)
122
- ? rows [idx].value.toString ()
140
+ (formRows [idx].type == FormDataType .file &&
141
+ formRows [idx].value.isNotEmpty)
142
+ ? formRows [idx].value.toString ()
123
143
: "Select File" ,
124
144
textAlign: TextAlign .center,
125
145
overflow: TextOverflow .ellipsis,
@@ -133,10 +153,11 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
133
153
)
134
154
: CellField (
135
155
keyId: "$selectedId -$idx -form-v-$seed " ,
136
- initialValue: rows [idx].value,
156
+ initialValue: formRows [idx].value,
137
157
hintText: " Add Value" ,
138
158
onChanged: (value) {
139
- rows[idx] = rows[idx].copyWith (value: value);
159
+ formRows[idx] = formRows[idx].copyWith (value: value);
160
+ if (isLast) formRows.add (kFormDataEmptyModel);
140
161
_onFieldChange (selectedId! );
141
162
},
142
163
colorScheme: Theme .of (context).colorScheme,
@@ -148,22 +169,24 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
148
169
pinStatus: PinStatus .none,
149
170
width: 30 ,
150
171
cellBuilder: (_, row) {
172
+ bool isLast = row.index + 1 == formRows.length;
151
173
return InkWell (
174
+ onTap: isLast
175
+ ? null
176
+ : () {
177
+ seed = random.nextInt (kRandMax);
178
+ if (formRows.length == 2 ) {
179
+ setState (() {
180
+ formRows = [kFormDataEmptyModel];
181
+ });
182
+ } else {
183
+ formRows.removeAt (row.index);
184
+ }
185
+ _onFieldChange (selectedId! );
186
+ },
152
187
child: Theme .of (context).brightness == Brightness .dark
153
188
? kIconRemoveDark
154
189
: kIconRemoveLight,
155
- onTap: () {
156
- seed = random.nextInt (kRandMax);
157
- if (rows.length == 1 ) {
158
- setState (() {
159
- rows = [kFormDataEmptyModel];
160
- });
161
- } else {
162
- rows.removeAt (row.index);
163
- }
164
- _onFieldChange (selectedId! );
165
- setState (() {});
166
- },
167
190
);
168
191
},
169
192
),
@@ -194,9 +217,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
194
217
padding: const EdgeInsets .only (bottom: 30 ),
195
218
child: ElevatedButton .icon (
196
219
onPressed: () {
197
- setState (() {
198
- rows.add (kFormDataEmptyModel);
199
- });
220
+ formRows.add (kFormDataEmptyModel);
200
221
_onFieldChange (selectedId! );
201
222
},
202
223
icon: const Icon (Icons .add),
@@ -210,11 +231,4 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
210
231
],
211
232
);
212
233
}
213
-
214
- void _onFieldChange (String selectedId) {
215
- ref.read (collectionStateNotifierProvider.notifier).update (
216
- selectedId,
217
- requestFormDataList: rows,
218
- );
219
- }
220
234
}
0 commit comments