call method

  1. @override
FutureOr<void> call(
  1. Hub hub,
  2. SentryFlutterOptions options
)
override

A Callable method for the Integration interface

Implementation

@override
FutureOr<void> call(Hub hub, SentryFlutterOptions options) async {
  options.addEventProcessor(
    (event, {hint}) async {
      try {
        final infos = Map<String, dynamic>.from(
          await (_channel.invokeMethod('loadContexts')),
        );
        if (infos['contexts'] != null) {
          final contexts = Contexts.fromJson(
            Map<String, dynamic>.from(infos['contexts'] as Map),
          );
          final eventContexts = event.contexts.clone();

          contexts.forEach(
            (key, dynamic value) {
              if (value != null) {
                if (key == SentryRuntime.listType) {
                  contexts.runtimes.forEach(eventContexts.addRuntime);
                } else if (eventContexts[key] == null) {
                  eventContexts[key] = value;
                }
              }
            },
          );
          event = event.copyWith(contexts: eventContexts);
        }

        if (infos['integrations'] != null) {
          final integrations =
              List<String>.from(infos['integrations'] as List);
          final sdk = event.sdk ?? options.sdk;
          integrations.forEach(sdk.addIntegration);
          event = event.copyWith(sdk: sdk);
        }

        if (infos['package'] != null) {
          final package = Map<String, String>.from(infos['package'] as Map);
          final sdk = event.sdk ?? options.sdk;
          sdk.addPackage(package['sdk_name']!, package['version']!);
          event = event.copyWith(sdk: sdk);
        }

        // on iOS, captureEnvelope does not call the beforeSend callback,
        // hence we need to add these tags here.
        if (event.sdk?.name == 'sentry.dart.flutter') {
          final tags = event.tags ?? {};
          tags['event.origin'] = 'flutter';
          tags['event.environment'] = 'dart';
          event = event.copyWith(tags: tags);
        }
      } catch (error) {
        options.logger(
          SentryLevel.error,
          'loadContextsIntegration failed : $error',
        );
      }

      return event;
    },
  );
  options.sdk.addIntegration('loadContextsIntegration');
}