Files
rtime/lib/images_manager.dart

80 lines
2.4 KiB
Dart

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<Uri> 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<String?> 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<Image?> 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);
}
}