From 2e3335e3745eed478ec3f3583207fdd3ff68d6ca Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Wed, 2 Apr 2025 00:00:33 +0200 Subject: [PATCH] preserve camera controls values after controller dispose --- .../bloc_container_camera.dart | 76 ++++++++++++------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/lib/screens/metering/components/camera_container/bloc_container_camera.dart b/lib/screens/metering/components/camera_container/bloc_container_camera.dart index ef6125e..4d9bd87 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -26,11 +26,12 @@ class CameraContainerBloc extends EvSourceBlocBase camera.lensDirection == CameraLensDirection.back, + orElse: () => cameras.last, + ); + } } + _cameraController = CameraController( - cameras.firstWhere( - (camera) => camera.lensDirection == CameraLensDirection.back, - orElse: () => cameras.last, - ), + _camera!, ResolutionPreset.low, enableAudio: false, ); - await _cameraController!.initialize(); await _cameraController!.setFlashMode(FlashMode.off); await _cameraController!.lockCaptureOrientation(DeviceOrientation.portraitUp); - _zoomRange = await Future.wait([ - _cameraController!.getMinZoomLevel(), - _cameraController!.getMaxZoomLevel(), - ]).then((levels) => RangeValues(math.max(1.0, levels[0]), math.min(_maxZoom, levels[1]))); - _currentZoom = _zoomRange!.start; + /// For app startup initialization this effectively isn't executed. + await Future.wait([ + if (_currentZoom != 1.0) _cameraController!.setZoomLevel(_currentZoom), + if (_currentExposureOffset != 0.0) _cameraController!.setExposureOffset(_currentExposureOffset), + ]); - _exposureOffsetRange = await Future.wait([ - _cameraController!.getMinExposureOffset(), - _cameraController!.getMaxExposureOffset(), - ]).then( - (levels) => RangeValues( - math.max(_exposureMaxRange.start, levels[0]), - math.min(_exposureMaxRange.end, levels[1]), - ), - ); - await _cameraController!.getExposureOffsetStepSize().then((value) { - _exposureStep = value == 0 ? 0.1 : value; - }); - _currentExposureOffset = 0.0; + if (_zoomRange == null) { + await Future.wait([ + _cameraController!.getMinZoomLevel(), + _cameraController!.getMaxZoomLevel(), + ]).then((value) { + _zoomRange = RangeValues( + math.max(1.0, value[0]), + math.min(_maxZoom, value[1]), + ); + _currentZoom = _zoomRange!.start; + }); + } + + if (_exposureOffsetRange == null) { + await Future.wait([ + _cameraController!.getMinExposureOffset(), + _cameraController!.getMaxExposureOffset(), + _cameraController!.getExposureOffsetStepSize(), + ]).then((value) { + _exposureOffsetRange = RangeValues( + math.max(_exposureMaxRange.start, value[0]), + math.min(_exposureMaxRange.end, value[1]), + ); + _currentExposureOffset = 0.0; + _exposureStep = value[2] == 0 ? 0.1 : value[2]; + }); + } emit(CameraInitializedState(_cameraController!)); - _emitActiveState(emit); } catch (e) { emit(const CameraErrorState(CameraErrorType.other));