createCamera method

Future<CameraController?> createCamera({
  1. CameraDescription? cameraDescription,
})

Create new camera

Implementation

Future<CameraController?> createCamera({
  CameraDescription? cameraDescription,
}) async {
  // if (cameraDescription == null) {
  //   _controllerNotifier.value = const ControllerValue();
  // }

  // Clear error first
  if (value.error != null) {
    value = value.copyWith();
  }

  var description = cameraDescription ?? value.cameraDescription;
  var cameras = value.cameras;

  // Fetch camera descriptions is description is not available
  if (description == null) {
    cameras = await availableCameras();
    if (cameras.isNotEmpty) {
      description = cameras[0];
    } else {
      description = const CameraDescription(
        name: 'Simulator',
        lensDirection: CameraLensDirection.front,
        sensorOrientation: 0,
      );
    }
  }

  // create camera controller
  _cameraController = CameraController(
    description,
    setting.resolutionPreset,
    enableAudio: value.enableAudio,
    imageFormatGroup: _setting.imageFormatGroup,
  );

  final controller = _cameraController!;

  // listen controller
  controller.addListener(() {
    if (controller.value.hasError) {
      final error = 'Camera error ${controller.value.errorDescription}';
      final exception = CameraException('createCamera', error);
      value = value.copyWith(error: exception);
      return;
      // _controllerNotifier.value =
      //     _controllerNotifier.value.copyWith(error: error);
    }
  });

  try {
    await controller.initialize();
    // _controllerNotifier.value = ControllerValue(
    //   controller: controller,
    //   isReady: true,
    // );
    value = value.copyWith(
      cameraDescription: description,
      cameras: cameras,
    );

    if (controller.description.lensDirection == CameraLensDirection.back) {
      unawaited(controller.setFlashMode(value.flashMode));
    }
    unawaited(
      Future.wait([
        controller
            .getMinExposureOffset()
            .then(_exposureController.setMinExposure),
        controller
            .getMaxExposureOffset()
            .then(_exposureController.setMaxExposure),
        controller.getMaxZoomLevel().then(_zoomController.setMaxZoom),
        controller.getMinZoomLevel().then(_zoomController.setMinZoom),
      ]),
    );
  } on CameraException catch (e) {
    value = value.copyWith(error: e);
    return null;
  } catch (e) {
    final exception = CameraException('createCamera', e.toString());
    value = value.copyWith(error: exception);
    return null;
  }
  return controller;
}