updateExposureOffset method

Future<void> updateExposureOffset(
  1. double value
)

Update the exposure offset using the exposure controller. 使用曝光控制器更新曝光值

Implementation

Future<void> updateExposureOffset(double value) async {
  final previousSliderOffsetValue = currentExposureSliderOffset.value;
  currentExposureSliderOffset.value = value;
  // Normalize the new exposure value if exposures have steps.
  if (exposureStep > 0) {
    final double inv = 1.0 / exposureStep;
    double roundedOffset = (value * inv).roundToDouble() / inv;
    if (roundedOffset > maxAvailableExposureOffset) {
      roundedOffset = (value * inv).floorToDouble() / inv;
    } else if (roundedOffset < minAvailableExposureOffset) {
      roundedOffset = (value * inv).ceilToDouble() / inv;
    }
    value = roundedOffset;
  }
  if (value == currentExposureOffset.value ||
      value < minAvailableExposureOffset ||
      value > maxAvailableExposureOffset) {
    return;
  }
  final previousOffsetValue = currentExposureOffset.value;
  currentExposureOffset.value = value;
  bool hasError = false;
  try {
    realDebugPrint('Updating the exposure offset value: $value');
    // Use [CameraPlatform] explicitly to reduce channel calls.
    await wrapControllerMethod(
      'setExposureOffset',
      () => CameraPlatform.instance.setExposureOffset(
        controller.cameraId,
        value,
      ),
    );
  } catch (e, s) {
    hasError = true;
    currentExposureSliderOffset.value = previousSliderOffsetValue;
    currentExposureOffset.value = previousOffsetValue;
    handleErrorWithHandler(e, s, pickerConfig.onError);
  } finally {
    if (!hasError && !isFocusPointDisplays.value) {
      isFocusPointDisplays.value = true;
    }
    restartExposurePointDisplayTimer();
    restartExposureModeDisplayTimer();
    restartExposureFadeOutTimer();
  }
}