import 'package:amplify_storage_s3/amplify_storage_s3.dart'; import 'package:flutter/material.dart'; import 'package:amplify_flutter/amplify_flutter.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'dart:io'; import 'package:uuid/uuid.dart'; import 'package:path/path.dart' as p; class StorageService { StorageService({ required Ref ref, }); ValueNotifier uploadProgress = ValueNotifier(0); Future getImageUrl(String key) async { final GetUrlResult result = await Amplify.Storage.getUrl( key: key, options: S3GetUrlOptions(expires: 60000), ); return result.url; } ValueNotifier getUploadProgress() { return uploadProgress; } Future uploadFile(File file) async { try { final extension = p.extension(file.path); final key = const Uuid().v1() + extension; await Amplify.Storage.uploadFile( local: file, key: key, onProgress: (progress) { uploadProgress.value = progress.getFractionCompleted(); }); return key; } on Exception catch (e) { debugPrint(e.toString()); return null; } } void resetUploadProgress() { uploadProgress.value = 0; } } final storageServiceProvider = Provider((ref) { return StorageService(ref: ref); }); final imageUrlProvider = FutureProvider.autoDispose.family((ref, key) { final storageService = ref.watch(storageServiceProvider); return storageService.getImageUrl(key); });