initialize method

Future<void> initialize()

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(),
      ),
    );
  }
}