import 'dart:io'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:logging/logging.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; import 'package:uuid/uuid.dart'; import 'package:image/image.dart' as img; import 'package:uuid/v5.dart'; class ImagesManager { static final ImagesManager instance = ImagesManager._internal(); ImagesManager._internal(); static final Logger log = Logger("ImagesManager"); static Uri? _imagesDirectory; Future get imageDirectory async { if(_imagesDirectory != null) return _imagesDirectory!; await _initImagesDirectory(); return _imagesDirectory!; } Future _initImagesDirectory() async { final directoryLoc = await getApplicationDocumentsDirectory(); final directoryName = "images"; final directoryPath = path.join(directoryLoc.path, directoryName); final directoryUri = Uri.directory(directoryPath); final directory = Directory.fromUri(directoryUri); if(!await directory.exists()) { log.info("Image directory does not yet extists. Creating it."); } directory.create(recursive: false); log.info("Image directory set up at '$directory'"); _imagesDirectory = directoryUri; } Future createImage(ImageSource source) async { // Get image from camera or not final XFile? ximage = await ImagePicker().pickImage(source: source); if(ximage == null) return null; final uuid = Uuid().v6(); final imageDir = await imageDirectory; ximage.saveTo(path.join(imageDir.path, uuid + path.extension(ximage.name))); return uuid; } Future loadImage(String imageUuid) async { final imageDir = await imageDirectory; if(!Uuid.isValidUUID(fromString: imageUuid)) { log.warning("Tried to load an image with an invalid UUID : '$imageUuid'."); return null; } final imagePath = path.join(imageDir.path, "$imageUuid.jpg"); final file = File(imagePath); if(!await file.exists()) { log.warning("Tried to load an image that does not extist: '$imagePath'."); return null; } return Image.file(file); } }