import 'dart:async';
import 'dart:html';
import 'dart:typed_data';
Future pickImageBytes() async {
final completer = Completer();
final input = FileUploadInputElement()
..accept = 'image/*'
..click();
// Detect cancellation: when user closes the file dialog without picking,
// onChange won't fire, but window.onFocus will when focus returns.
StreamSubscription? focusSub;
focusSub = window.onFocus.listen((_) {
focusSub?.cancel();
if (!completer.isCompleted) {
completer.complete(null);
}
});
input.onChange.listen((_) {
focusSub?.cancel();
final file = input.files?.first;
if (file == null) {
completer.complete(null);
return;
}
final reader = FileReader();
reader.onLoad.listen((_) {
completer.complete(reader.result as Uint8List);
});
reader.onError.listen((_) {
completer.complete(null);
});
reader.readAsArrayBuffer(file);
});
return completer.future;
}