pickMultipleMedia method

  1. @override
Future<List<String>?> pickMultipleMedia(
  1. MediaSource source,
  2. MediaType type,
  3. MediaOptions options
)
override

Implementation

@override
Future<List<String>?> pickMultipleMedia(
    MediaSource source, MediaType type, MediaOptions options) async {
  if (source == MediaSource.camera) {
    throw Exception(
        'Multiple media capture from camera not supported on web');
  }
  final completer = Completer<List<String>?>();
  final input = web.document.createElement('input') as web.HTMLInputElement;
  input.type = 'file';
  input.multiple = true;
  input.style.display = 'none';
  switch (type) {
    case MediaType.image:
      input.accept = 'image/*';
      break;
    case MediaType.video:
      input.accept = 'video/*';
      break;
    default:
      input.accept = '*/*';
  }
  input.addEventListener(
      'change',
      (event) async {
        final files = input.files;
        if (files != null && files.length > 0) {
          final results = <String>[];
          for (var i = 0; i < files.length; i++) {
            final file = files.item(i);
            if (file == null) continue;
            if (type == MediaType.image) {
              final result = await _processImageFile(file, options);
              if (result != null) results.add(result);
            } else if (type == MediaType.video) {
              final url = await _processVideoFileWithWatermark(file, options);
              if (url != null) results.add(url);
            }
          }
          completer.complete(results);
        } else {
          completer.complete(null);
        }
      } as web.EventListener);
  if (web.document.body != null) {
    web.document.body!.appendChild(input);
  }
  input.click();
  input.remove();
  return completer.future;
}