captureScreenshot method

Future<CockpitCaptureResult> captureScreenshot(
  1. CockpitScreenshotRequest request, {
  2. CockpitCaptureProfile? profile,
  3. bool allowFallback = true,
})

Implementation

Future<CockpitCaptureResult> captureScreenshot(
  CockpitScreenshotRequest request, {
  CockpitCaptureProfile? profile,
  bool allowFallback = true,
}) async {
  final effectiveProfile = profile ?? _defaultProfileFor(request);
  final effectiveRequest = request.snapshotOptions == null
      ? request.copyWith(
          snapshotOptions: _defaultSnapshotOptionsFor(request.reason),
        )
      : request;
  final surfaceState = _requireSurfaceState();

  if (effectiveRequest.reason == CockpitScreenshotReason.acceptance) {
    await waitForUiIdle();
  }

  final snapshotData = effectiveRequest.includeSnapshot
      ? surfaceState.snapshot(
          options:
              effectiveRequest.snapshotOptions ??
              _defaultSnapshotOptionsFor(effectiveRequest.reason),
        )
      : null;

  final prefersNativeCapture =
      effectiveProfile == CockpitCaptureProfile.acceptance ||
      effectiveProfile == CockpitCaptureProfile.nativePreferred;
  if (prefersNativeCapture &&
      await FlutterCockpit.binding.queryNativeCaptureAvailability()) {
    try {
      final screenshot = await FlutterCockpit.binding.nativeCapture.capture(
        request: effectiveRequest,
        profile: effectiveProfile,
        snapshot: snapshotData,
      );
      return CockpitCaptureResult(
        screenshot: screenshot,
        requestedProfile: effectiveProfile,
        resolvedCaptureKind: CockpitCaptureKind.nativeAcceptance,
      );
    } on MissingPluginException catch (error) {
      if (!allowFallback) {
        rethrow;
      }

      final screenshot = await surfaceState.captureScreenshot(
        effectiveRequest,
      );
      return CockpitCaptureResult(
        screenshot: screenshot,
        requestedProfile: effectiveProfile,
        resolvedCaptureKind: CockpitCaptureKind.flutterView,
        usedFallback: true,
        degradationReason: error.message,
      );
    } on PlatformException catch (error) {
      if (!allowFallback) {
        rethrow;
      }

      final screenshot = await surfaceState.captureScreenshot(
        effectiveRequest,
      );
      return CockpitCaptureResult(
        screenshot: screenshot,
        requestedProfile: effectiveProfile,
        resolvedCaptureKind: CockpitCaptureKind.flutterView,
        usedFallback: true,
        degradationReason: error.message ?? error.code,
      );
    }
  }

  final screenshot = await surfaceState.captureScreenshot(effectiveRequest);
  return CockpitCaptureResult(
    screenshot: screenshot,
    requestedProfile: effectiveProfile,
    resolvedCaptureKind: CockpitCaptureKind.flutterView,
  );
}