37 lines
1.0 KiB
Dart
37 lines
1.0 KiB
Dart
import 'dart:async';
|
|
import 'dart:ui';
|
|
import 'package:croppy/croppy.dart';
|
|
import 'package:cross_file/cross_file.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
Future<XFile?> cropImage(
|
|
BuildContext context, {
|
|
required XFile image,
|
|
List<CropAspectRatio?>? allowedAspectRatios,
|
|
bool replacePath = true,
|
|
}) async {
|
|
if (!context.mounted) return null;
|
|
final imageBytes = await image.readAsBytes();
|
|
if (!context.mounted) return null;
|
|
final result = await showMaterialImageCropper(
|
|
context,
|
|
imageProvider: MemoryImage(imageBytes),
|
|
showLoadingIndicatorOnSubmit: true,
|
|
allowedAspectRatios: allowedAspectRatios,
|
|
);
|
|
if (result == null) return null; // Cancelled operation
|
|
final croppedFile = result.uiImage;
|
|
final croppedBytes = await croppedFile.toByteData(
|
|
format: ImageByteFormat.png,
|
|
);
|
|
if (croppedBytes == null) {
|
|
return image;
|
|
}
|
|
croppedFile.dispose();
|
|
return XFile.fromData(
|
|
croppedBytes.buffer.asUint8List(),
|
|
path: !replacePath ? image.path : null,
|
|
mimeType: image.mimeType,
|
|
);
|
|
}
|