@@ -10,6 +10,7 @@ import '../flet_app_services.dart';
10
10
import '../flet_control_backend.dart' ;
11
11
import '../flet_server.dart' ;
12
12
import '../models/control.dart' ;
13
+ import '../utils/numbers.dart' ;
13
14
import '../utils/platform.dart' ;
14
15
import '../utils/strings.dart' ;
15
16
import 'flet_store_mixin.dart' ;
@@ -27,23 +28,32 @@ class FilePickerResultEvent {
27
28
}
28
29
29
30
class FilePickerFile {
31
+ final int id;
30
32
final String name;
31
33
final String ? path;
32
34
final int size;
33
35
34
- FilePickerFile ({required this .name, required this .path, required this .size});
36
+ FilePickerFile (
37
+ {required this .id,
38
+ required this .name,
39
+ required this .path,
40
+ required this .size});
35
41
36
42
Map <String , dynamic > toJson () =>
37
- < String , dynamic > {'name' : name, 'path' : path, 'size' : size};
43
+ < String , dynamic > {'id' : id, ' name': name, 'path' : path, 'size' : size};
38
44
}
39
45
40
46
class FilePickerUploadFile {
47
+ final int id;
41
48
final String name;
42
49
final String uploadUrl;
43
50
final String method;
44
51
45
52
FilePickerUploadFile (
46
- {required this .name, required this .uploadUrl, required this .method});
53
+ {required this .id,
54
+ required this .name,
55
+ required this .uploadUrl,
56
+ required this .method});
47
57
}
48
58
49
59
class FilePickerUploadProgressEvent {
@@ -119,17 +129,23 @@ class _FilePickerControlState extends State<FilePickerControl>
119
129
! isDesktopPlatform ()) {
120
130
resetDialogState ();
121
131
}
132
+
122
133
widget.backend.triggerControlEvent (
123
- widget.control.id,
124
- "result" ,
125
- json.encode (FilePickerResultEvent (
126
- path: _path,
127
- files: _files
128
- ? .map ((f) => FilePickerFile (
129
- name: f.name,
130
- path: kIsWeb ? null : f.path,
131
- size: f.size))
132
- .toList ())));
134
+ widget.control.id,
135
+ "result" ,
136
+ json.encode (FilePickerResultEvent (
137
+ path: _path,
138
+ files: _files? .asMap ().entries.map ((entry) {
139
+ PlatformFile f = entry.value;
140
+ return FilePickerFile (
141
+ id: entry.key, // use entry's index as id
142
+ name: f.name,
143
+ path: kIsWeb ? null : f.path,
144
+ size: f.size,
145
+ );
146
+ }).toList (),
147
+ )),
148
+ );
133
149
}
134
150
135
151
if (_state != state) {
@@ -154,7 +170,7 @@ class _FilePickerControlState extends State<FilePickerControl>
154
170
allowMultiple: allowMultiple,
155
171
withData: false ,
156
172
withReadStream: true )
157
- .then ((result) {
173
+ .then ((FilePickerResult ? result) {
158
174
debugPrint ("pickFiles() completed" );
159
175
_files = result? .files;
160
176
sendEvent ();
@@ -177,7 +193,7 @@ class _FilePickerControlState extends State<FilePickerControl>
177
193
sendEvent ();
178
194
});
179
195
}
180
- // saveFile
196
+ // getDirectoryPath
181
197
else if (state? .toLowerCase () == "getdirectorypath" && ! kIsWeb) {
182
198
FilePicker .platform
183
199
.getDirectoryPath (
@@ -207,17 +223,28 @@ class _FilePickerControlState extends State<FilePickerControl>
207
223
Future uploadFiles (String filesJson, FletServer server, Uri pageUri) async {
208
224
var uj = json.decode (filesJson);
209
225
var uploadFiles = (uj as List ).map ((u) => FilePickerUploadFile (
210
- name: u["name" ], uploadUrl: u["upload_url" ], method: u["method" ]));
226
+ id: parseInt (u["id" ], - 1 )! , // -1 = invalid
227
+ name: u["name" ],
228
+ uploadUrl: u["upload_url" ],
229
+ method: u["method" ]));
230
+
211
231
for (var uf in uploadFiles) {
212
- var file = _files! .firstWhereOrNull ((f) => f.name == uf.name);
232
+ var file = ((uf.id >= 0 && uf.id < _files! .length)
233
+ ? _files! [uf.id]
234
+ : null ) // by id
235
+ ??
236
+ _files! .firstWhereOrNull ((f) => f.name == uf.name); // by name
237
+
213
238
if (file != null ) {
214
239
try {
215
240
await uploadFile (
216
241
file, server, getFullUploadUrl (pageUri, uf.uploadUrl), uf.method);
217
- _files! .remove (file);
242
+ _files! .remove (file); // Remove the uploaded file
218
243
} catch (e) {
219
244
sendProgress (server, file.name, null , e.toString ());
220
245
}
246
+ } else {
247
+ debugPrint ("Error: File '${uf .name }' (id: ${uf .id }) not found." );
221
248
}
222
249
}
223
250
}
0 commit comments