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 photoFiles; @override _CameraPageState createState() => _CameraPageState(); } class _CameraPageState extends State { 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!, ); } }