initialize method
Implementation
Future<void> initialize() async {
if (_disposed) return;
_update(const FaceCaptureState());
CameraController? camController;
try {
late final CameraController prepared;
await Future.wait<void>([
prepareCamera().then((c) => prepared = c),
_ensureDetectorWarmed(),
]);
camController = prepared;
if (_disposed) {
await _releaseCamera();
return;
}
_cameraController = camController;
_update(
_state.copyWith(
phase: FaceCapturePhase.ready,
cameraController: camController,
),
);
await _waitForPreviewToSettle();
if (_disposed) return;
if (camController.value.isInitialized &&
!camController.value.isStreamingImages) {
_streamFramesSkipped = 0;
await camController.startImageStream(_onCameraFrame);
}
} on CameraException catch (e) {
if (_cameraController != camController) {
try {
await camController?.dispose();
} catch (_) {}
}
if (_disposed) return;
final denied =
e.code == 'CameraAccessDenied' ||
e.code == 'CameraAccessDeniedWithoutPrompt' ||
e.code == 'CameraAccessRestricted';
_update(
_state.copyWith(
phase: denied
? FaceCapturePhase.permissionDenied
: FaceCapturePhase.cameraError,
errorMessage: e.description ?? e.code,
),
);
} catch (e) {
if (_cameraController != camController) {
try {
await camController?.dispose();
} catch (_) {}
}
if (_disposed) return;
_update(
_state.copyWith(
phase: FaceCapturePhase.cameraError,
errorMessage: e.toString(),
),
);
}
}