showMediaListPicker function

Future<List<ChosenMedia>?> showMediaListPicker(
  1. BuildContext context,
  2. FlutterMediaContentType<Object> mediaType, {
  3. required VoidCallback onLoading,
  4. VoidCallback? onPermissionsInitialized,
  5. FilesSelected? onSelected,
  6. FileChanged? onChange,
  7. int maxSelections = 1,
  8. double? cropAspectRatio,
  9. bool crop = true,
  10. bool preemptPermission = true,
  11. Set<FileSourceType>? sourceTypes,
  12. MediaSelectFn imageSelector = Choosers.flutterFilePicker,
  13. dynamic extraOptions,
})

Implementation

Future<List<ChosenMedia>?> showMediaListPicker(
  BuildContext context,
  FlutterMediaContentType mediaType, {
  required VoidCallback onLoading,
  VoidCallback? onPermissionsInitialized,
  FilesSelected? onSelected,
  FileChanged? onChange,
  int maxSelections = 1,
  double? cropAspectRatio,
  bool crop = true,
  bool preemptPermission = true,
  Set<FileSourceType>? sourceTypes,
  MediaSelectFn imageSelector = Choosers.flutterFilePicker,
  dynamic extraOptions,
}) async {
  final permission = await checkAndRequestPermissions(
    context,
    title: (intl) => intl!.permissionRequestPhotos,
    permission: Permission.photos,
    preemptPermission: preemptPermission,
  );
  switch (permission) {
    case SunnyPermissionStatus.rejected:
      SunnyHud.notification(
          context, "You haven't granted access to your photos.",
          isDismissible: true, onTap: (_, en) {
        openAppSettings();
        en?.dismiss();
      });
      break;
    case SunnyPermissionStatus.granted:
      try {
        onPermissionsInitialized?.call();
        var start = DateTime.now();
        final files = await imageSelector(
          context,
          maxSelections: maxSelections,
          onLoading: () {},
          sourceTypes: sourceTypes,
          mediaType: mediaType,
          extraOptions: extraOptions,
        );
        var end = DateTime.now();

        if (crop == true && files.length == 1 && files.first.file != null) {
          final imageFile = files.first.file;
          onChange?.call(imageFile, false);
          final cropPt = await ((infoX.isIOS || infoX.isAndroid)
              ? Croppers.cropNative(context, imageFile!,
                  cropAspectRatio: cropAspectRatio)
              : Croppers.cropFallback(context, imageFile!,
                  cropAspectRatio: cropAspectRatio));
          // Upload new image
          onChange?.call(cropPt, true);
          return [ChosenMedia.ofFile(cropPt)];
        }
        _log.info("Took ${end.difference(start)} to pick");

        onSelected?.call(files);
        return files;
      } on NoImagesSelectedException {
        return [];
      }
    case SunnyPermissionStatus.later:
      return [];
  }
  return null;
}