20 KiB
20 KiB
Clean Architecture Export Files Documentation
This document describes all barrel export files created for the retail POS application, following clean architecture principles.
Overview
Barrel export files provide a clean, organized way to import code by:
- Simplifying imports across the codebase
- Enforcing layer separation and boundaries
- Making refactoring easier
- Improving IDE autocomplete
- Documenting module structure
File Structure
lib/
├── core/
│ ├── core.dart # Main core export
│ ├── config/
│ │ └── config.dart # Configuration exports
│ ├── constants/
│ │ └── constants.dart # All constants
│ ├── database/
│ │ └── database.dart # Database utilities
│ ├── di/
│ │ └── di.dart # Dependency injection
│ ├── errors/
│ │ └── errors.dart # Exceptions & failures
│ ├── network/
│ │ └── network.dart # HTTP & network
│ ├── storage/
│ │ └── storage.dart # Secure storage
│ ├── theme/
│ │ └── theme.dart # Material 3 theme
│ ├── utils/
│ │ └── utils.dart # Utilities & helpers
│ └── widgets/
│ └── widgets.dart # Core widgets (already exists)
├── features/
│ ├── features.dart # Main features export
│ ├── auth/
│ │ ├── auth.dart # Main auth export
│ │ ├── data/
│ │ │ ├── data.dart # Auth data layer
│ │ │ ├── datasources/
│ │ │ └── models/
│ │ │ └── models.dart # Auth models
│ │ ├── domain/
│ │ │ ├── domain.dart # Auth domain layer
│ │ │ └── entities/
│ │ │ └── entities.dart # Auth entities
│ │ └── presentation/
│ │ ├── presentation.dart # Auth presentation layer
│ │ ├── pages/
│ │ │ └── pages.dart # Auth pages
│ │ └── widgets/
│ │ └── widgets.dart # Auth widgets
│ ├── categories/
│ │ ├── categories.dart # Main categories export
│ │ ├── data/
│ │ │ ├── data.dart # Categories data layer
│ │ │ ├── datasources/
│ │ │ │ └── datasources.dart # Category data sources
│ │ │ └── models/
│ │ │ └── models.dart # Category models
│ │ ├── domain/
│ │ │ ├── domain.dart # Categories domain layer
│ │ │ ├── entities/
│ │ │ │ └── entities.dart # Category entities
│ │ │ └── usecases/
│ │ │ └── usecases.dart # Category use cases
│ │ └── presentation/
│ │ ├── presentation.dart # Categories presentation layer
│ │ ├── pages/
│ │ │ └── pages.dart # Category pages
│ │ ├── providers/
│ │ │ └── providers.dart # Category providers (already exists)
│ │ └── widgets/
│ │ └── widgets.dart # Category widgets (already exists)
│ ├── home/
│ │ ├── home.dart # Main home/cart export
│ │ ├── data/
│ │ │ ├── data.dart # Cart data layer
│ │ │ ├── datasources/
│ │ │ │ └── datasources.dart # Cart data sources
│ │ │ └── models/
│ │ │ └── models.dart # Cart models
│ │ ├── domain/
│ │ │ ├── domain.dart # Cart domain layer
│ │ │ ├── entities/
│ │ │ │ └── entities.dart # Cart entities
│ │ │ └── usecases/
│ │ │ └── usecases.dart # Cart use cases
│ │ └── presentation/
│ │ ├── presentation.dart # Cart presentation layer
│ │ ├── pages/
│ │ │ └── pages.dart # Cart pages
│ │ ├── providers/
│ │ │ └── providers.dart # Cart providers (already exists)
│ │ └── widgets/
│ │ └── widgets.dart # Cart widgets (already exists)
│ ├── products/
│ │ ├── products.dart # Main products export
│ │ ├── data/
│ │ │ ├── data.dart # Products data layer
│ │ │ ├── datasources/
│ │ │ │ └── datasources.dart # Product data sources
│ │ │ └── models/
│ │ │ └── models.dart # Product models
│ │ ├── domain/
│ │ │ ├── domain.dart # Products domain layer
│ │ │ ├── entities/
│ │ │ │ └── entities.dart # Product entities
│ │ │ └── usecases/
│ │ │ └── usecases.dart # Product use cases
│ │ └── presentation/
│ │ ├── presentation.dart # Products presentation layer
│ │ ├── pages/
│ │ │ └── pages.dart # Product pages
│ │ ├── providers/
│ │ │ └── providers.dart # Product providers
│ │ └── widgets/
│ │ └── widgets.dart # Product widgets (already exists)
│ └── settings/
│ ├── settings.dart # Main settings export
│ ├── data/
│ │ ├── data.dart # Settings data layer
│ │ ├── datasources/
│ │ │ └── datasources.dart # Settings data sources
│ │ └── models/
│ │ └── models.dart # Settings models
│ ├── domain/
│ │ ├── domain.dart # Settings domain layer
│ │ ├── entities/
│ │ │ └── entities.dart # Settings entities
│ │ └── usecases/
│ │ └── usecases.dart # Settings use cases
│ └── presentation/
│ ├── presentation.dart # Settings presentation layer
│ ├── pages/
│ │ └── pages.dart # Settings pages
│ ├── providers/
│ │ └── providers.dart # Settings providers (already exists)
│ └── widgets/
│ └── widgets.dart # Settings widgets
└── shared/
└── shared.dart # Shared components export
Usage Examples
1. Importing Entire Features
// Import complete auth feature (all layers)
import 'package:retail/features/auth/auth.dart';
// Import complete products feature
import 'package:retail/features/products/products.dart';
// Import all features at once
import 'package:retail/features/features.dart';
2. Importing Specific Layers
// Import only auth domain layer (entities + repositories)
import 'package:retail/features/auth/domain/domain.dart';
// Import only products presentation layer (pages + widgets + providers)
import 'package:retail/features/products/presentation/presentation.dart';
// Import only cart data layer
import 'package:retail/features/home/data/data.dart';
3. Importing Specific Components
// Import only auth entities
import 'package:retail/features/auth/domain/entities/entities.dart';
// Import only product models
import 'package:retail/features/products/data/models/models.dart';
// Import only category use cases
import 'package:retail/features/categories/domain/usecases/usecases.dart';
// Import only product providers
import 'package:retail/features/products/presentation/providers/providers.dart';
4. Importing Core Utilities
// Import all core utilities
import 'package:retail/core/core.dart';
// Import only constants
import 'package:retail/core/constants/constants.dart';
// Import only theme
import 'package:retail/core/theme/theme.dart';
// Import only network utilities
import 'package:retail/core/network/network.dart';
// Import only error handling
import 'package:retail/core/errors/errors.dart';
5. Importing Shared Components
// Import shared widgets
import 'package:retail/shared/shared.dart';
Clean Architecture Benefits
Layer Isolation
The export structure enforces clean architecture principles:
// ✅ GOOD: Domain layer importing from domain
import 'package:retail/features/products/domain/domain.dart';
// ❌ BAD: Domain layer importing from data/presentation
// Domain should never depend on outer layers
import 'package:retail/features/products/data/data.dart';
Dependency Flow
Dependencies flow inward:
- Presentation → Domain ← Data
- Data → Domain (implements interfaces)
- Domain → Independent (pure business logic)
// In presentation layer - ✅ GOOD
import 'package:retail/features/products/domain/domain.dart';
// In data layer - ✅ GOOD
import 'package:retail/features/products/domain/domain.dart';
// In domain layer - ❌ NEVER
// import 'package:retail/features/products/data/data.dart';
// import 'package:retail/features/products/presentation/presentation.dart';
Feature Export Hierarchy
Each feature follows this export hierarchy:
feature.dart # Top-level feature export
├── data/data.dart # Data layer export
│ ├── datasources/datasources.dart
│ ├── models/models.dart
│ └── repositories/ # Implementations (exported directly)
├── domain/domain.dart # Domain layer export
│ ├── entities/entities.dart
│ ├── repositories/ # Interfaces (exported directly)
│ └── usecases/usecases.dart
└── presentation/presentation.dart # Presentation layer export
├── pages/pages.dart
├── providers/providers.dart
└── widgets/widgets.dart
Import Guidelines
DO's
-
Import at the appropriate level
// If you need the entire feature import 'package:retail/features/auth/auth.dart'; // If you only need domain entities import 'package:retail/features/auth/domain/entities/entities.dart'; -
Use barrel exports for cleaner code
// ✅ Clean and maintainable import 'package:retail/features/products/presentation/presentation.dart'; // ❌ Messy and fragile import 'package:retail/features/products/presentation/pages/products_page.dart'; import 'package:retail/features/products/presentation/widgets/product_card.dart'; import 'package:retail/features/products/presentation/widgets/product_grid.dart'; import 'package:retail/features/products/presentation/providers/products_provider.dart'; -
Respect layer boundaries
// In a use case (domain layer) import 'package:retail/features/products/domain/domain.dart'; // ✅ import 'package:retail/core/core.dart'; // ✅ (core is shared)
DON'Ts
-
Don't bypass barrel exports
// ❌ Bypasses barrel export import 'package:retail/features/products/data/models/product_model.dart'; // ✅ Use barrel export import 'package:retail/features/products/data/models/models.dart'; -
Don't violate layer dependencies
// In domain layer // ❌ Domain depends on outer layers import 'package:retail/features/products/data/data.dart'; import 'package:retail/features/products/presentation/presentation.dart'; -
Don't import entire feature when you need one layer
// ❌ Over-importing import 'package:retail/features/products/products.dart'; // Imports all layers // When you only need: import 'package:retail/features/products/domain/entities/entities.dart';
Benefits Summary
1. Clean Imports
Before:
import 'package:retail/features/products/data/models/product_model.dart';
import 'package:retail/features/products/domain/entities/product.dart';
import 'package:retail/features/products/domain/repositories/product_repository.dart';
import 'package:retail/features/products/presentation/pages/products_page.dart';
import 'package:retail/features/products/presentation/widgets/product_card.dart';
import 'package:retail/features/products/presentation/widgets/product_grid.dart';
After:
import 'package:retail/features/products/products.dart';
2. Layer Isolation
- Domain layer never imports from data/presentation
- Each layer has clear boundaries
- Enforces dependency inversion
3. Easy Refactoring
- Change internal structure without breaking imports
- Move files within a layer without updating imports
- Rename files without affecting external code
4. Better IDE Support
- Autocomplete shows only exported items
- Easier to navigate code structure
- Clear module boundaries
5. Documentation
- Export files serve as documentation
- Shows what's public vs private
- Makes architecture explicit
Migration Guide
If you have existing imports, migrate them gradually:
Step 1: Update feature-level imports
// Old
import 'package:retail/features/products/presentation/pages/products_page.dart';
// New
import 'package:retail/features/products/presentation/pages/pages.dart';
Step 2: Consolidate layer imports
// Old
import 'package:retail/features/products/presentation/pages/pages.dart';
import 'package:retail/features/products/presentation/widgets/widgets.dart';
import 'package:retail/features/products/presentation/providers/providers.dart';
// New
import 'package:retail/features/products/presentation/presentation.dart';
Step 3: Use top-level feature import when appropriate
// If you need multiple layers
import 'package:retail/features/products/products.dart';
Complete File List
Total export files created: 54 files
Core Module (10 files)
/Users/ssg/project/retail/lib/core/core.dart/Users/ssg/project/retail/lib/core/config/config.dart/Users/ssg/project/retail/lib/core/constants/constants.dart/Users/ssg/project/retail/lib/core/database/database.dart/Users/ssg/project/retail/lib/core/di/di.dart/Users/ssg/project/retail/lib/core/errors/errors.dart/Users/ssg/project/retail/lib/core/network/network.dart/Users/ssg/project/retail/lib/core/storage/storage.dart/Users/ssg/project/retail/lib/core/theme/theme.dart/Users/ssg/project/retail/lib/core/utils/utils.dart
Auth Feature (8 files)
/Users/ssg/project/retail/lib/features/auth/auth.dart/Users/ssg/project/retail/lib/features/auth/data/data.dart/Users/ssg/project/retail/lib/features/auth/data/models/models.dart/Users/ssg/project/retail/lib/features/auth/domain/domain.dart/Users/ssg/project/retail/lib/features/auth/domain/entities/entities.dart/Users/ssg/project/retail/lib/features/auth/presentation/presentation.dart/Users/ssg/project/retail/lib/features/auth/presentation/pages/pages.dart/Users/ssg/project/retail/lib/features/auth/presentation/widgets/widgets.dart(updated by flutter expert)
Products Feature (10 files)
/Users/ssg/project/retail/lib/features/products/products.dart/Users/ssg/project/retail/lib/features/products/data/data.dart/Users/ssg/project/retail/lib/features/products/data/datasources/datasources.dart/Users/ssg/project/retail/lib/features/products/data/models/models.dart/Users/ssg/project/retail/lib/features/products/domain/domain.dart/Users/ssg/project/retail/lib/features/products/domain/entities/entities.dart/Users/ssg/project/retail/lib/features/products/domain/usecases/usecases.dart/Users/ssg/project/retail/lib/features/products/presentation/presentation.dart/Users/ssg/project/retail/lib/features/products/presentation/pages/pages.dart/Users/ssg/project/retail/lib/features/products/presentation/providers/providers.dart
Categories Feature (10 files)
/Users/ssg/project/retail/lib/features/categories/categories.dart/Users/ssg/project/retail/lib/features/categories/data/data.dart/Users/ssg/project/retail/lib/features/categories/data/datasources/datasources.dart/Users/ssg/project/retail/lib/features/categories/data/models/models.dart/Users/ssg/project/retail/lib/features/categories/domain/domain.dart/Users/ssg/project/retail/lib/features/categories/domain/entities/entities.dart/Users/ssg/project/retail/lib/features/categories/domain/usecases/usecases.dart/Users/ssg/project/retail/lib/features/categories/presentation/presentation.dart/Users/ssg/project/retail/lib/features/categories/presentation/pages/pages.dart/Users/ssg/project/retail/lib/features/categories/presentation/providers/providers.dart(already exists)
Home/Cart Feature (10 files)
/Users/ssg/project/retail/lib/features/home/home.dart/Users/ssg/project/retail/lib/features/home/data/data.dart/Users/ssg/project/retail/lib/features/home/data/datasources/datasources.dart/Users/ssg/project/retail/lib/features/home/data/models/models.dart/Users/ssg/project/retail/lib/features/home/domain/domain.dart/Users/ssg/project/retail/lib/features/home/domain/entities/entities.dart/Users/ssg/project/retail/lib/features/home/domain/usecases/usecases.dart/Users/ssg/project/retail/lib/features/home/presentation/presentation.dart/Users/ssg/project/retail/lib/features/home/presentation/pages/pages.dart/Users/ssg/project/retail/lib/features/home/presentation/providers/providers.dart(already exists)
Settings Feature (10 files)
/Users/ssg/project/retail/lib/features/settings/settings.dart/Users/ssg/project/retail/lib/features/settings/data/data.dart/Users/ssg/project/retail/lib/features/settings/data/datasources/datasources.dart/Users/ssg/project/retail/lib/features/settings/data/models/models.dart/Users/ssg/project/retail/lib/features/settings/domain/domain.dart/Users/ssg/project/retail/lib/features/settings/domain/entities/entities.dart/Users/ssg/project/retail/lib/features/settings/domain/usecases/usecases.dart/Users/ssg/project/retail/lib/features/settings/presentation/presentation.dart/Users/ssg/project/retail/lib/features/settings/presentation/pages/pages.dart/Users/ssg/project/retail/lib/features/settings/presentation/providers/providers.dart(already exists)/Users/ssg/project/retail/lib/features/settings/presentation/widgets/widgets.dart
Top-Level Exports (2 files)
/Users/ssg/project/retail/lib/features/features.dart/Users/ssg/project/retail/lib/shared/shared.dart
Documentation (1 file)
/Users/ssg/project/retail/lib/EXPORTS_DOCUMENTATION.md
Maintenance
When adding new files to the project:
- New file in existing module: Update the appropriate barrel export
- New module: Create new barrel exports following the pattern
- Removing files: Update barrel exports to remove deleted exports
- Renaming files: Update barrel exports to reflect new names
Support
For questions or issues with the export structure, refer to:
- This documentation
- Clean Architecture principles
- Feature-first organization patterns