Last active
December 12, 2021 18:19
-
-
Save Roaa94/65d77ffea17f6bb99673812c3b0d4a56 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:io'; | |
import 'dart:math'; | |
import 'package:flutter/material.dart'; | |
import 'package:flutter_image_compress/flutter_image_compress.dart'; | |
import 'package:flutter_tutorials/avatar-uploader-tutorial/data/services/media/media_service_interface.dart'; | |
import 'package:flutter_tutorials/avatar-uploader-tutorial/data/services/permission/permission_service.dart'; | |
import 'package:flutter_tutorials/avatar-uploader-tutorial/data/services/service_locator.dart'; | |
import 'package:image_picker/image_picker.dart'; | |
import 'package:path_provider/path_provider.dart' as path_provider; | |
class MediaService implements MediaServiceInterface { | |
@override | |
PermissionService get permissionService => getIt<PermissionService>(); | |
Future<bool> _handleImageUploadPermissions(BuildContext context, AppImageSource? _imageSource) async { | |
if (_imageSource == null) { | |
return false; | |
} | |
if (_imageSource == AppImageSource.camera) { | |
return await permissionService.handleCameraPermission(context); | |
} else if (_imageSource == AppImageSource.gallery) { | |
return await permissionService.handlePhotosPermission(context); | |
} else { | |
return false; | |
} | |
} | |
@override | |
Future<File?> uploadImage( | |
BuildContext context, | |
AppImageSource appImageSource, { | |
bool shouldCompress = true, | |
}) async { | |
// Handle permissions according to image source, | |
bool canProceed = await _handleImageUploadPermissions(context, appImageSource); | |
if (canProceed) { | |
File? processedPickedImageFile; | |
// Convert our own AppImageSource into a format readable by the used package | |
// In this case it's an ImageSource enum | |
ImageSource? _imageSource = ImageSource.values.byName(appImageSource.name); | |
final imagePicker = ImagePicker(); | |
final rawPickedImageFile = await imagePicker.pickImage(source: _imageSource, imageQuality: 50); | |
if (rawPickedImageFile != null) { | |
//to convert from XFile type provided by the package to dart:io's File type | |
processedPickedImageFile = File(rawPickedImageFile.path); | |
if (shouldCompress) { | |
processedPickedImageFile = await compressFile(processedPickedImageFile); | |
} | |
} | |
return processedPickedImageFile; | |
} | |
} | |
@override | |
Future<File?> compressFile(File file, {int quality = 30}) async { | |
final dir = await path_provider.getTemporaryDirectory(); | |
final targetPath = dir.absolute.path + '/${Random().nextInt(1000)}-temp.jpg'; | |
return await FlutterImageCompress.compressAndGetFile( | |
file.absolute.path, | |
targetPath, | |
quality: quality, | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment