createAssetEntityAndPop method

Future<void> createAssetEntityAndPop()

When users confirm to use the taken file, create the AssetEntity. While the entity might returned null, there's no side effects if popping null because the parent picker will ignore it.

Implementation

Future<void> createAssetEntityAndPop() async {
  if (isSavingEntity) {
    return;
  }
  setState(() {
    isSavingEntity = true;
  });

  // Handle the explicitly entity saving method.
  if (widget.pickerConfig.onEntitySaving != null) {
    try {
      await widget.pickerConfig.onEntitySaving!(
        context,
        widget.viewType,
        File(widget.previewXFile.path),
      );
    } catch (e, s) {
      handleErrorWithHandler(e, s, onError);
    } finally {
      safeSetState(() {
        isSavingEntity = false;
      });
    }
    return;
  }

  AssetEntity? entity;
  try {
    final PermissionState ps = await PhotoManager.requestPermissionExtend();
    if (ps == PermissionState.authorized || ps == PermissionState.limited) {
      switch (widget.viewType) {
        case CameraPickerViewType.image:
          final String filePath = previewFile.path;
          entity = await PhotoManager.editor.saveImageWithPath(
            filePath,
            title: path.basename(previewFile.path),
          );
          break;
        case CameraPickerViewType.video:
          entity = await PhotoManager.editor.saveVideo(
            previewFile,
            title: path.basename(previewFile.path),
          );
          break;
      }
      if (widget.pickerConfig.shouldDeletePreviewFile &&
          previewFile.existsSync()) {
        previewFile.delete().catchError((e, s) {
          handleErrorWithHandler(e, s, onError);
          return previewFile;
        });
      }
      return;
    }
    handleErrorWithHandler(
      StateError(
        'Permission is not fully granted to save the captured file.',
      ),
      StackTrace.current,
      onError,
    );
  } catch (e, s) {
    realDebugPrint('Saving entity failed: $e');
    handleErrorWithHandler(e, s, onError);
  } finally {
    safeSetState(() {
      isSavingEntity = false;
    });
    if (mounted) {
      Navigator.of(context).pop(entity);
    }
  }
}