Dependency Injection
Priority: P1 (HIGH)
Structure
core/injection/
├── injection.dart # Initialization & setup
└── modules/ # Third-party dependency modules (Dio, Storage)
Implementation Workflow
- Annotate classes — Use
@injectableannotations; avoid manual registry calls. - Choose scope — Default to
@LazySingletonfor repositories, services, and data sources (init on demand). - Register BLoCs as factories — Use
@injectable(Factory) for BLoCs to ensure state resets per instance. Never use@Singleton()for BLoCs. - Inject abstractions — Always register implementations as abstract interfaces (
as: IService). - Register third-party deps — Use
@modulefor external instances (Dio, Hive, SharedPreferences). - Prefer constructor injection — Use mandatory constructor parameters;
injectableresolves them automatically.
Registration & Test Mock Examples
See implementation examples for module registration and test mock swap patterns.
Reference & Examples
For module configuration and initialization templates: See references/REFERENCE.md.
Anti-Patterns
- No Inline
getItCalls: Inject via constructor instead of calling GetIt in UIbuild() - No
@SingletonBLoCs: Always use@injectable(Factory) to ensure state resets - No Concrete Class Injection: Always inject abstract interface (e.g.,
IOrderRepository) - No Manual Registration: Use
@injectableannotations instead of manualgetIt.registercalls in production code
Related Topics
layer-based-clean-architecture | testing