executeHooks method
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,
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;
}