mobdr/lib/ui/visit/photo_camera.dart

120 lines
3.2 KiB
Dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:flutter/services.dart';
import 'package:mobdr/core/components/custom_camera_preview.dart';
import 'package:mobdr/service/shared_prefs.dart';
class CameraPage extends StatefulWidget {
const CameraPage({Key? key, required this.photoFiles}) : super(key: key);
final List<File> photoFiles;
@override
_CameraPageState createState() => _CameraPageState();
}
class _CameraPageState extends State<CameraPage> {
CameraController? controller;
late List cameras;
late int selectedCameraIdx;
@override
void initState() {
super.initState();
// Remove the constraint when entering, this is ok
// not to away since the app is in portrait mode by
// default
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
availableCameras().then((availableCameras) {
cameras = availableCameras;
if (cameras.isNotEmpty) {
setState(() {
selectedCameraIdx = 0;
});
_initCameraController(cameras[selectedCameraIdx]).then((void v) {});
} else {
print("No camera available");
}
}).catchError((err) {
print('Error: $err.code\nError Message: $err.message');
});
}
@override
void dispose() {
// Dispose the controller when the widget is disposed.
controller?.dispose();
super.dispose();
}
Future _initCameraController(CameraDescription cameraDescription) async {
ResolutionPreset getResolutionPresetFromPhotoQuality(String photoQuality) {
switch (photoQuality) {
case 'low':
return ResolutionPreset.low;
case 'medium':
return ResolutionPreset.medium;
case 'high':
return ResolutionPreset.high;
case 'veryHigh':
return ResolutionPreset.veryHigh;
case 'ultraHigh':
return ResolutionPreset.ultraHigh;
case 'max':
return ResolutionPreset.max;
default:
return ResolutionPreset
.veryHigh; // Default value if quality is not recognised
}
}
ResolutionPreset resolutionPreset =
getResolutionPresetFromPhotoQuality(SharedPrefs().photoQuality);
if (controller != null) {
await controller!.dispose();
}
controller = CameraController(cameraDescription, resolutionPreset,
enableAudio: false);
controller!.addListener(() {
if (mounted) {
setState(() {});
}
if (controller!.value.hasError) {
print('Camera error ${controller!.value.errorDescription}');
}
});
try {
await controller!.initialize();
} on CameraException catch (e) {
print(e.description);
}
if (mounted) {
setState(() {});
}
}
@override
Widget build(BuildContext context) {
if (controller == null || !controller!.value.isInitialized) {
return const Center(
child: CircularProgressIndicator(
color: Colors.red,
));
}
return CustomCameraPreview(
photoFiles: widget.photoFiles,
cameraController: controller!,
);
}
}