From c63b5a420d01b40594f801062250ea70168ecd69 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sun, 21 May 2023 11:50:46 +0200 Subject: [PATCH] ML-74 `CameraContainerBloc` crashes (#75) * nullable var instead of `late` * `.then((_) => _cameraController = null));` --- .../bloc_container_camera.dart | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 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 d70e6a2..877c0ef 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -23,7 +23,7 @@ import 'package:lightmeter/utils/log_2.dart'; class CameraContainerBloc extends EvSourceBlocBase { final MeteringInteractor _meteringInteractor; late final _WidgetsBindingObserver _observer; - late CameraController _cameraController; + CameraController? _cameraController; static const _maxZoom = 7.0; RangeValues? _zoomRange; @@ -60,7 +60,7 @@ class CameraContainerBloc extends EvSourceBlocBase close() async { WidgetsBinding.instance.removeObserver(_observer); - unawaited(_cameraController.dispose()); + unawaited(_cameraController?.dispose().then((_) => _cameraController = null)); communicationBloc.add(communication_event.MeteringEndedEvent(_ev100)); return super.close(); } @@ -118,30 +118,30 @@ class CameraContainerBloc extends EvSourceBlocBase([ - _cameraController.getMinZoomLevel(), - _cameraController.getMaxZoomLevel(), + _cameraController!.getMinZoomLevel(), + _cameraController!.getMaxZoomLevel(), ]).then((levels) => RangeValues(levels[0], math.min(_maxZoom, levels[1]))); _currentZoom = _zoomRange!.start; _exposureOffsetRange = await Future.wait([ - _cameraController.getMinExposureOffset(), - _cameraController.getMaxExposureOffset(), + _cameraController!.getMinExposureOffset(), + _cameraController!.getMaxExposureOffset(), ]).then( (levels) => RangeValues( math.max(_exposureMaxRange.start, levels[0]), math.min(_exposureMaxRange.end, levels[1]), ), ); - await _cameraController.getExposureOffsetStepSize().then((value) { + await _cameraController!.getExposureOffsetStepSize().then((value) { _exposureStep = value == 0 ? 0.1 : value; }); _currentExposureOffset = 0.0; - emit(CameraInitializedState(_cameraController)); + emit(CameraInitializedState(_cameraController!)); _emitActiveState(emit); } catch (e) { @@ -151,19 +151,23 @@ class CameraContainerBloc extends EvSourceBlocBase _onDeinitialize(DeinitializeEvent _, Emitter emit) async { emit(const CameraLoadingState()); - unawaited(_cameraController.dispose()); + unawaited(_cameraController?.dispose().then((_) => _cameraController = null)); } Future _onZoomChanged(ZoomChangedEvent event, Emitter emit) async { - _cameraController.setZoomLevel(event.value); - _currentZoom = event.value; - _emitActiveState(emit); + if (_cameraController != null) { + _cameraController!.setZoomLevel(event.value); + _currentZoom = event.value; + _emitActiveState(emit); + } } Future _onExposureOffsetChanged(ExposureOffsetChangedEvent event, Emitter emit) async { - _cameraController.setExposureOffset(event.value); - _currentExposureOffset = event.value; - _emitActiveState(emit); + if (_cameraController != null) { + _cameraController!.setExposureOffset(event.value); + _currentExposureOffset = event.value; + _emitActiveState(emit); + } } Future _onExposureOffsetResetEvent(ExposureOffsetResetEvent event, Emitter emit) async { @@ -183,12 +187,13 @@ class CameraContainerBloc extends EvSourceBlocBase - !(!_cameraController.value.isInitialized || _cameraController.value.isTakingPicture); + bool get _canTakePhoto => !(_cameraController == null || + !_cameraController!.value.isInitialized || + _cameraController!.value.isTakingPicture); Future _takePhoto() async { try { - final file = await _cameraController.takePicture(); + final file = await _cameraController!.takePicture(); final Uint8List bytes = await file.readAsBytes(); Directory(file.path).deleteSync(recursive: true);