Clean Architecture (Robert C. Martin) to wzorzec architektoniczny który separuje business logic od frameworków, UI i external dependencies. Dla MVP: nie implementuj wszystkiego, ale rozumiej zasady.
Dependency Rule: Dependencies wskazują do środka, nigdy na zewnątrz.
Efekt: Business logic nie zależy od Flutter, Firebase czy żadnego frameworka. Można je testować bez UI.
Pełna Clean Architecture to overkill dla MVP. Ale zasady są uniwersalne: separuj business logic od UI i data sources. To wystarczy.
Folder structure:
domain/ — business logic
entities/ — User, Product, Orderrepositories/ — interfaces (abstrakcje)usecases/ — LoginUseCase, GetProductsUseCasedata/ — implementacje
repositories/ — UserRepositoryImpldatasources/ — FirebaseDataSource, ApiDataSourcemodels/ — UserModel (DTO)presentation/ — UI
screens/ — LoginScreen, DashboardScreenwidgets/ — reusable componentsproviders/ — Riverpod state management1. Entity (domain/entities/user.dart):
class User { final String id; final String email; }2. Repository Interface (domain/repositories/user_repository.dart):
abstract class UserRepository { Future<User> login(String email, String password); }3. Use Case (domain/usecases/login_usecase.dart):
4. Repository Implementation (data/repositories/user_repository_impl.dart):
5. UI (presentation/screens/login_screen.dart):
Jak połączyć warstwy? Dependency Injection.
Riverpod providers:
userRepositoryProvider → zwraca UserRepositoryImplloginUseCaseProvider → używa userRepositoryProviderŁatwo zmienić implementację (Firebase → REST API) bez zmiany business logic.
Dla MVP produkcyjnego: użyj uproszczonej wersji (3 warstwy: domain, data, presentation).
Zaimplementuj jedną feature (np. login) używając Clean Architecture. Stwórz: Entity, Repository interface, Use Case, Repository impl, UI. Przetestuj use case bez UI.