Feature-Based Clean Architecture
Priority: P0 (CRITICAL)
Structure
Every feature lives in lib/features/ with 3-layer separation (domain/data/presentation):
domain/— Entities, failures, and Repository interfaces.data/— DTOs, DataSource, and Repository implementations.presentation/— BLoC/Cubit, pages, and widgets.
See references/folder-structure.md for complete directory blueprint.
Implementation Workflow
- Create feature directory — Add new folder under
lib/features/(e.g.,lib/features/promotions/). - Define domain layer — Add entities, failures, and repository interfaces with zero external dependencies.
- Implement data layer — Add DTOs, data sources, and repository implementations that depend only on Domain.
- Build presentation layer — Add BLoC/Cubit, pages, and widgets that depend only on Domain.
- Enforce dependency rule —
Presentation -> Domain <- Data. Domain must zero external dependencies. - Share cross-cutting logic — Move reusable utilities to
lib/shared/orlib/core/.
Feature Directory Example
See implementation examples for full directory tree and cross-feature import patterns.
Reference & Examples
For feature folder blueprints and cross-layer dependency templates: See references/REFERENCE.md.
Anti-Patterns
- No Cross-Feature Data Imports: Only import Domain types across features
- No UI/Data in Domain Layer: Never put UI or Data classes inside
domain/ - No Nested Features: Keep
lib/features/flat with no sub-feature directories - No Direct Repository Calls: Use specific BLoCs or use-cases instead of calling other features' repositories directly from UI
Related Topics
layer-based-clean-architecture | retrofit-networking | go-router-navigation | bloc-state-management | dependency-injection