# Flutter Dependency Injection

> Configure service locator setup using injectable and get_it in Flutter. Use when wiring dependency injection with get_it or injectable.

- Skill: `hoangnguyen0403/flutter-dependency-injection` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add hoangnguyen0403/flutter-dependency-injection`
- Raw SKILL.md: https://api.skillmd.com/api/skills/hoangnguyen0403/flutter-dependency-injection/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: HoangNguyen0403 (https://skillmd.com/u/hoangnguyen0403)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/hoangnguyen0403/flutter-dependency-injection

---

# Dependency Injection

## **Priority: P1 (HIGH)**


## Structure

```text
core/injection/
├── injection.dart  # Initialization & setup
└── modules/        # Third-party dependency modules (Dio, Storage)
```

## Implementation Workflow

1. **Annotate classes** — Use `@injectable` annotations; avoid manual registry calls.
2. **Choose scope** — Default to `@LazySingleton` for repositories, services, and data sources (init on demand).
3. **Register BLoCs as factories** — Use `@injectable` (Factory) for BLoCs to ensure state resets per instance. Never use `@Singleton()` for BLoCs.
4. **Inject abstractions** — Always register implementations as abstract interfaces (`as: IService`).
5. **Register third-party deps** — Use `@module` for external instances (Dio, Hive, SharedPreferences).
6. **Prefer constructor injection** — Use mandatory constructor parameters; `injectable` resolves them automatically.

### Registration & Test Mock Examples

See [implementation examples](references/implementation.md) for module registration and test mock swap patterns.

## Reference & Examples

For module configuration and initialization templates:
See [references/REFERENCE.md](references/REFERENCE.md).

## Anti-Patterns

- **No Inline `getIt` Calls**: Inject via constructor instead of calling GetIt in UI `build()`
- **No `@Singleton` BLoCs**: Always use `@injectable` (Factory) to ensure state resets
- **No Concrete Class Injection**: Always inject abstract interface (e.g., `IOrderRepository`)
- **No Manual Registration**: Use `@injectable` annotations instead of manual `getIt.register` calls in production code

## Related Topics

layer-based-clean-architecture | testing

## Canonical response anchors

When this skill applies, preserve the following domain terminology or equivalent concrete examples in the answer when relevant:
- Dependency Injection
- abstract interface

## Remediation anchors

- Remediation anchors: factory registration, fresh CartBloc instance

