pickImages method
Picks one or more images from the device gallery/photo picker.
Implementation
@override
Future<List<AdaptiveFile>> pickImages(PickerOptions options) async {
final completer = Completer<List<AdaptiveFile>>();
final input = web.document.createElement('input') as web.HTMLInputElement;
input.type = 'file';
input.style.display = 'none';
switch (options.mediaType) {
case MediaType.image:
input.accept = 'image/*';
break;
case MediaType.video:
input.accept = 'video/*';
break;
case MediaType.all:
input.accept = 'image/*,video/*';
break;
}
if (options.isMultiple) {
input.multiple = true;
}
input.onchange = ((web.Event event) {
final fileList = input.files;
if (fileList == null || fileList.length == 0) {
if (!completer.isCompleted) completer.complete([]);
input.remove();
return;
}
final List<Future<AdaptiveFile>> fileFutures = [];
for (int i = 0; i < fileList.length; i++) {
final web.File? file = fileList.item(i);
if (file != null) {
fileFutures.add(_readWebFile(file));
}
}
Future.wait(fileFutures).then((files) {
if (!completer.isCompleted) completer.complete(files);
}).catchError((err) {
if (!completer.isCompleted) completer.completeError(err);
}).whenComplete(() {
input.remove();
});
}).toJS;
// Handle cancel / window focus back
web.window.addEventListener(
'focus',
((web.Event event) {
Future.delayed(const Duration(milliseconds: 800), () {
if (!completer.isCompleted && (input.files == null || input.files?.length == 0)) {
completer.complete([]);
input.remove();
}
});
}).toJS,
true.toJS,
);
web.document.body?.appendChild(input);
input.click();
return completer.future;
}