executeHooks method

Future<Map<String, dynamic>> executeHooks(
  1. HookStage stage,
  2. String flagKey,
  3. Map<String, dynamic>? context, {
  4. dynamic result,
  5. Exception? error,
  6. EvaluationDetails? evaluationDetails,
  7. HookHints? hints,
  8. ClientMetadata? clientMetadata,
  9. ProviderMetadata? providerMetadata,
  10. dynamic defaultValue,
  11. FlagValueType? flagValueType,
  12. HookData? hookData,
})

Execute hooks for a specific stage

Implementation

Future<Map<String, dynamic>> executeHooks(
  HookStage stage,
  String flagKey,
  Map<String, dynamic>? context, {
  dynamic result,
  Exception? error,
  EvaluationDetails? evaluationDetails,
  HookHints? hints,
  ClientMetadata? clientMetadata,
  ProviderMetadata? providerMetadata,
  dynamic defaultValue,
  FlagValueType? flagValueType,
  HookData? hookData,
}) async {
  var currentContext = Map<String, dynamic>.from(context ?? const {});
  final evaluationHookData = hookData ?? HookData();
  for (final hook in _hooksForStage(stage)) {
    final hookContext = HookContext(
      flagKey: flagKey,
      evaluationContext: currentContext,
      result: result,
      error: error,
      clientMetadata: clientMetadata,
      providerMetadata: providerMetadata,
      defaultValue: defaultValue,
      flagValueType: flagValueType,
      hookData: evaluationHookData._scopeFor(hook),
    );

    try {
      final contextUpdates = await _executeHookWithTimeout(
        hook,
        stage,
        hookContext,
        hook.metadata.config.timeout,
        evaluationDetails,
        hints,
      );

      if (stage == HookStage.BEFORE &&
          contextUpdates != null &&
          contextUpdates.isNotEmpty) {
        currentContext = {...currentContext, ...contextUpdates};
      }
    } catch (e) {
      if (stage == HookStage.BEFORE || stage == HookStage.AFTER) {
        rethrow;
      }
      print('Error in ${hook.metadata.name} hook: $e');
    }
  }

  return currentContext;
}