bespokeCamera method

Future<void> bespokeCamera(
  1. BuildContext context,
  2. ShowCameraAction cameraAction,
  3. ScopeManager? scopeManager
)

Opens Ensemble's custom camera widget.

Implementation

Future<void> bespokeCamera(BuildContext context,
    ShowCameraAction cameraAction, ScopeManager? scopeManager) async {
  Widget? overlayWidget;
  Widget? loadingWidget;
  if (cameraAction.overlayWidget != null) {
    overlayWidget = buildOverlayWidget(scopeManager, cameraAction);
  }

  if (cameraAction.loadingWidget != null) {
    loadingWidget = buildLoadingWidget(scopeManager, cameraAction);
  }

  Camera camera = Camera(
    overlayWidget: overlayWidget,
    loadingWidget: loadingWidget,
    onCapture: cameraAction.onCapture == null
        ? null
        : () {
            ScreenController()
                .executeAction(context, cameraAction.onCapture!);
          },
    onComplete: cameraAction.onComplete == null
        ? null
        : () {
            ScreenController()
                .executeAction(context, cameraAction.onComplete!);
          },
    onError: cameraAction.onError == null
        ? null
        : (error) {
            ScreenController().executeAction(
              context,
              cameraAction.onError!,
              event: EnsembleEvent(
                null,
                error: error.toString(),
              ),
            );
          },
  );

  if (cameraAction.id != null) {
    final previousAction =
        scopeManager?.dataContext.getContextById(cameraAction.id!) as Camera?;
    if (previousAction != null) camera = previousAction;
    scopeManager?.dataContext.addInvokableContext(cameraAction.id!, camera);
  }

  if (cameraAction.options != null) {
    if (cameraAction.options!['assistAngle'] != null) {
      camera.setProperty('assistAngle', true);
      for (var option in cameraAction.options!['assistAngle'].keys) {
        final property = _angleAssistOptions[option];
        if (property != null) {
          camera.setProperty(
              property, cameraAction.options!['assistAngle']![option]);
        }
      }
    }

    if (cameraAction.options!['assistSpeed'] != null) {
      camera.setProperty('assistSpeed', true);
      for (var option in cameraAction.options!['assistSpeed'].keys) {
        final property = _speedAssistOptions[option];
        if (property != null) {
          camera.setProperty(
              property, cameraAction.options!['assistSpeed']![option]);
        }
      }
    }

    for (var option in cameraAction.options!.keys) {
      final property = _optionMappings[option];
      if (property != null) {
        final value =
            scopeManager?.dataContext.eval(cameraAction.options![option]);
        camera.setProperty(property, value);
      }
    }
  }

  await Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => camera,
    ),
  );

  if (cameraAction.onClose != null) {
    try {
      // ignore: use_build_context_synchronously
      ScreenController().executeAction(context, cameraAction.onClose!);
    } catch (_) {}
  }

  if (cameraAction.id != null) {
    scopeManager?.dispatch(
        ModelChangeEvent(WidgetBindingSource(cameraAction.id!), camera));
  }
}