Hilt Dependency Injection Guide for Scalable Android Apps
A concise guide to Hilt scopes, modules, testing replacements, and avoiding dependency graphs that become hard to reason about.
Scope By Lifetime
Scopes should match object lifetime. Use singleton scope for shared infrastructure, ViewModel scope for screen state coordination, and unscoped bindings for cheap objects.
Prefer Constructor Injection
Constructor injection keeps dependencies visible and testable.
class FetchOrdersUseCase @Inject constructor(
private val repository: OrdersRepository
)Test Replacements
Use Hilt test modules to replace network and database dependencies with deterministic fakes.
Keep Modules Focused
Large dependency modules become difficult to review. Group bindings by ownership and lifecycle.