Skip to content

Commit

Permalink
ML-72 buildPreview() was called on a disposed CameraController (#73)
Browse files Browse the repository at this point in the history
* added `DeinitializeEvent`

* typo
  • Loading branch information
vodemn authored May 19, 2023
1 parent 00b2728 commit 8b74c4e
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ import 'package:lightmeter/utils/log_2.dart';
class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraContainerState> {
final MeteringInteractor _meteringInteractor;
late final _WidgetsBindingObserver _observer;
CameraController? _cameraController;
CameraController? get cameraController => _cameraController;
late CameraController _cameraController;

static const _maxZoom = 7.0;
RangeValues? _zoomRange;
Expand All @@ -50,6 +49,7 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
on<RequestPermissionEvent>(_onRequestPermission);
on<OpenAppSettingsEvent>(_onOpenAppSettings);
on<InitializeEvent>(_onInitialize);
on<DeinitializeEvent>(_onDeinitialize);
on<ZoomChangedEvent>(_onZoomChanged);
on<ExposureOffsetChangedEvent>(_onExposureOffsetChanged);
on<ExposureOffsetResetEvent>(_onExposureOffsetResetEvent);
Expand All @@ -60,7 +60,7 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
@override
Future<void> close() async {
WidgetsBinding.instance.removeObserver(_observer);
unawaited(_cameraController?.dispose());
unawaited(_cameraController.dispose());
communicationBloc.add(communication_event.MeteringEndedEvent(_ev100));
return super.close();
}
Expand Down Expand Up @@ -118,45 +118,50 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
enableAudio: false,
);

await _cameraController!.initialize();
await _cameraController!.setFlashMode(FlashMode.off);
await _cameraController.initialize();
await _cameraController.setFlashMode(FlashMode.off);

_zoomRange = await Future.wait<double>([
_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<double>([
_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) {
emit(const CameraErrorState(CameraErrorType.other));
}
}

Future<void> _onDeinitialize(DeinitializeEvent _, Emitter emit) async {
emit(const CameraLoadingState());
unawaited(_cameraController.dispose());
}

Future<void> _onZoomChanged(ZoomChangedEvent event, Emitter emit) async {
_cameraController!.setZoomLevel(event.value);
_cameraController.setZoomLevel(event.value);
_currentZoom = event.value;
_emitActiveState(emit);
}

Future<void> _onExposureOffsetChanged(ExposureOffsetChangedEvent event, Emitter emit) async {
_cameraController!.setExposureOffset(event.value);
_cameraController.setExposureOffset(event.value);
_currentExposureOffset = event.value;
_emitActiveState(emit);
}
Expand All @@ -178,13 +183,12 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
);
}

bool get _canTakePhoto => !(_cameraController == null ||
!_cameraController!.value.isInitialized ||
_cameraController!.value.isTakingPicture);
bool get _canTakePhoto =>
!(!_cameraController.value.isInitialized || _cameraController.value.isTakingPicture);

Future<double?> _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);

Expand Down Expand Up @@ -213,8 +217,7 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
add(const InitializeEvent());
case AppLifecycleState.paused:
case AppLifecycleState.detached:
_cameraController?.dispose();
_cameraController = null;
add(const DeinitializeEvent());
default:
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ class InitializeEvent extends CameraContainerEvent {
const InitializeEvent();
}

class ReinitializeEvent extends CameraContainerEvent {
const ReinitializeEvent();
class DeinitializeEvent extends CameraContainerEvent {
const DeinitializeEvent();
}

class ZoomChangedEvent extends CameraContainerEvent {
Expand Down

0 comments on commit 8b74c4e

Please sign in to comment.