cropImage function
dynamic
cropImage()
Implementation
cropImage() {
return """
// ignore_for_file: library_private_types_in_public_api
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_crop/image_crop.dart';
class CropImage extends StatefulWidget {
const CropImage({Key? key, required this.onTap, required this.file})
: super(key: key);
@override
_CropImageState createState() => _CropImageState();
final Function(File) onTap;
final File file;
}
class _CropImageState extends State<CropImage> {
final cropKey = GlobalKey<CropState>();
File? _file;
File? _lastCropped;
@override
void initState() {
setState(() {
_file = widget.file;
});
super.initState();
}
@override
void dispose() {
super.dispose();
_file?.delete();
_lastCropped?.delete();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Stack(
children: [
Container(
color: Colors.black,
padding:
const EdgeInsets.symmetric(vertical: 40.0, horizontal: 20.0),
child: _buildCroppingImage(),
),
Positioned(
top: 16.0,
right: 16.0,
child: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: const SizedBox(
child: Icon(
Icons.close,
color: Colors.white,
size: 16,
),
),
),
)
],
),
);
}
Widget _buildCroppingImage() {
return Column(
children: <Widget>[
Expanded(
child: Crop.file(_file!, key: cropKey),
),
Container(
padding: const EdgeInsets.only(top: 20.0),
alignment: AlignmentDirectional.center,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
TextButton(
child: Text(
'Cancel',
style: Theme.of(context)
.textTheme
.button!
.copyWith(color: Colors.white),
),
onPressed: () {
Navigator.pop(context);
},
),
TextButton(
child: Text(
'Done',
style: Theme.of(context)
.textTheme
.button!
.copyWith(color: Colors.white),
),
onPressed: () => _cropImage(),
),
],
),
)
],
);
}
Future<void> _cropImage() async {
final scale = cropKey.currentState!.scale;
final area = cropKey.currentState!.area;
if (area == null) {
// cannot crop, widget is not setup
return;
}
// scale up to use maximum possible number of pixels
// this will sample image in higher resolution to make cropped image larger
final sample = await ImageCrop.sampleImage(
file: _file!,
preferredSize: (2000 / scale).round(),
);
final file = await ImageCrop.cropImage(
file: sample,
area: area,
);
sample.delete();
_lastCropped?.delete();
_lastCropped = file;
widget.onTap(file);
Navigator.pop(context);
}
}
""";
}