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);