showPhotoSelectionSheet<T extends Object> function

Future<List<XFile>> showPhotoSelectionSheet<T extends Object>({
  1. required BuildContext context,
  2. PhotoSelectionL10n l10n = const PhotoSelectionL10n(),
  3. VoidCallback? onSettingAppOpenRequested,
  4. bool requestFullMetadata = false,
  5. bool allowMultiple = false,
  6. (List<SheetAction<T>>, ValueSetter<T>)? additionalActions,
})

Implementation

Future<List<XFile>> showPhotoSelectionSheet<T extends Object>({
  required BuildContext context,
  PhotoSelectionL10n l10n = const PhotoSelectionL10n(),
  VoidCallback? onSettingAppOpenRequested,
  bool requestFullMetadata = false,
  bool allowMultiple = false,
  (List<SheetAction<T>>, ValueSetter<T>)? additionalActions,
}) async {
  final source = await showModalActionSheet<Object>(
    context: context,
    title: l10n.title,
    actions: [
      SheetAction(
        icon: Icons.perm_media,
        label: l10n.chooseFromLibrary,
        key: ImageSource.gallery,
      ),
      SheetAction(
        icon: Icons.camera_alt,
        label: l10n.takePicture,
        key: ImageSource.camera,
      ),
      if (additionalActions != null) ...additionalActions.$1,
    ],
  );

  if (source == null) {
    return [];
  }

  final picker = ImagePicker();
  try {
    if (source == ImageSource.gallery && allowMultiple) {
      return await picker.pickMultiImage(
        requestFullMetadata: requestFullMetadata,
      );
    } else if (source is ImageSource) {
      final file = await picker.pickImage(
        source: source,
        requestFullMetadata: requestFullMetadata,
      );
      return file == null ? [] : [file];
    } else if (source is T) {
      additionalActions!.$2(source);
    } else {
      logger.warning('Invalid source type: $source');
    }
  } on PlatformException catch (e) {
    logger.warning(e);
    if (![
      ImagePickerErrorCodes.cameraAccessRestricted,
      ImagePickerErrorCodes.cameraAccessDenied,
      ImagePickerErrorCodes.photoAccessRestricted,
      ImagePickerErrorCodes.photoAccessDenied,
    ].contains(e.code)) {
      // ignore: use_build_context_synchronously
      showErrorDialog(context: context, error: e);
      return [];
    }

    if (onSettingAppOpenRequested == null) {
      return [];
    }

    const okKey = 'ok';
    // ignore: use_build_context_synchronously
    final result = await showModalActionSheet<String>(
      context: context,
      title: l10n.accessRestrictedTitle,
      message: l10n.accessRestrictedMessage,
      actions: [SheetAction(label: l10n.accessRestrictedOk, key: okKey)],
    );
    if (result == okKey) {
      onSettingAppOpenRequested();
    }
  }
  return [];
}