Tokens#
These are typed keys used to request values from the context.
-
Plain:
createToken<T>()— no default, must be supplied by a provider. Otherwise it will throw a MissingProviderError on access. -
With default:
createToken<T>((inject) => T(...))— default creation when no override exists. - Value:
createValueToken<T>(value)— static value, no factory. -
Collection:
createCollectionToken<T>()— aggregate list built from additional providers.
final apiClientToken = createToken<ApiClient>();
final configToken = createToken<Config>((_) => Config.defaults());
final appNameToken = createValueToken('MyApp');
final pluginToken = createCollectionToken<Plugin>();
Providers#
Providers describe and can modify what values are supplied:
token.provideOverride((inject) => T)— replaces any existing value.token.provideAdditional((inject) => [T, T])— appends items to a collection token.
final apiClientProvider = apiClientToken.provideOverride(
(inject) => HttpApiClient(inject(configToken))
);
final pluginProvider = pluginToken.provideAdditional(
(_) => [LoggingPlugin()]
);
WiretapContext#
The context holds providers and resolves values with ordering and cycle safety.
final wiretapContext = WiretapContext(providers: [
apiClientProvider,
pluginProvider,
]);
final inject = context.inject;
final client = inject(apiClientToken);
The inject function#
This is the core of wiretap. It allows for resolving any token from the WiretapContext. You would typically use it inside of Tokens and Providers to get access to your depdendencies like so:
final fooServiceToken = createToken((inject) {
return AuthenticationService(
environment: inject(environmentToken),
httpClient: inject(httpClientToken),
);
});
To get access to the inject function from the WiretapContext do the following:
final inject = wiretapContext.inject;
Next: See what can be done with wiretap in Design Patterns.