Skip to main content

Introduction

What is wiretap?​

wiretap is a extremely lightweight, type-safe dependency injection library for Dart. It uses declaritive typed keys to define injectable values and providers to configure how values are resolved. You compose a WiretapContext to supply and override dependencies.

note

wiretap embraces simplicity and clarity. It provides a minimal API that enables sophisticated dependency management patterns while remaining easy to understand and maintain.

Highlights​

  • Zero dependencies*, minimal runtime cost
  • Strong typing with generics
  • Declarative defaults via tokens
  • Protection against circular dependencies
  • Predictable overrides and ordering
  • Works in pure Dart and Flutter

*While wiretap would like to use no dependencies, the official meta package is still required to provide analyzer feedback. This is the only dependency in use though.

Getting Started​

Installation​

To add the package to your pubspec.yaml run:
Dart: dart pub add wiretap
Flutter: flutter pub add wiretap

First steps​

Define tokens, create a context, and resolve values.

import 'package:wiretap/wiretap.dart';

final configToken = createValueToken(Config(apiUrl: 'https://api.example.com'));
final httpClientToken = createToken((_) => HttpClient());
final apiServiceToken = createToken((inject) =>
ApiService(inject(httpClientToken), inject(configToken))
);

final context = WiretapContext();
final apiService = context.inject(apiServiceToken);

Overriding values​

Override dependencies per environment or test.

final testContext = WiretapContext(providers: [
httpClientToken.provideOverride((_) => MockHttpClient()),
configToken.provideOverride((_) => TestConfig()),
]);

final testApiService = testContext.inject(apiServiceToken);

Collections​

Aggregate multiple values of the same type. This can be used to provide implementations of the same interface:

final pluginToken = provideCollection<Plugin>();

final context = WiretapContext(providers: [
pluginToken.provideAdditional((_) => [AuthPlugin(), LoggingPlugin()]),
pluginToken.provideAdditional((_) => [MetricsPlugin()]),
]);

final plugins = context.inject(pluginToken);