This project is a Flutter application following the Clean Architecture design pattern and MVVM (Model-View-ViewModel), inspired by the Flutter Advanced Course - Clean Architecture With MVVM by Mina Farid on Udemy.
This app demonstrates the Clean Architecture design pattern in Flutter, with the separation of concerns between different layers: Data, Domain, and Presentation. It provides a scalable, testable, and maintainable code structure.
- State Management using Stream Controller and RX Dart
- Full MVVM Pattern:
- ViewModel Inputs and Outputs
- Base ViewModel and Base UseCase
- Multiple UI States managed via State Renderer (Full screen and popup states)
- Localization with support for English and Persian (RTL - LTR)
- Remote Data Source with API integration
- Local Data Source for caching
- Dependency Injection and Repository pattern implementation
- Mock APIs for testing
- Responsive UI with SVG and JSON Animations
The project follows Clean Architecture with clear separations between:
- Presentation Layer: UI components (Splash, Onboarding, Login, etc.), state rendering, and localization.
- Domain Layer: Business logic with UseCases, Repository interfaces, and models.
- Data Layer: API calls, caching, and data transformation (using mappers and the toDomain concept).
- Data Layer:
- API Client with interceptor and JSON serialization.
- Caching with a local data source.
- Mappers to convert API responses to domain models.
- Domain Layer:
- UseCases to handle business logic.
- Either concept for handling success (Right) and failure (Left) cases.
- Presentation Layer:
- State Management with RX Dart and Stream Builder.
- State Renderer to handle loading, success, and error states.
- Flutter and Dart
- RX Dart for state management.
- Retrofit for HTTP requests.
- Lottie for JSON animations.
- GetIt for dependency injection.
- 18 Flutter packages in total (JSON, SVG, animations, etc.)
![Home](https://private-user-images.githubusercontent.com/77167918/367053303-7a8b6953-be9a-4cac-80e7-a7ba50dd1034.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjE0NDUsIm5iZiI6MTczODkyMTE0NSwicGF0aCI6Ii83NzE2NzkxOC8zNjcwNTMzMDMtN2E4YjY5NTMtYmU5YS00Y2FjLTgwZTctYTdiYTUwZGQxMDM0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA5MzkwNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUzZDYzMWJhNDc2ZDk0MDJjMzEwOWEwOGNkY2NkZDUwOTE2YzgyMDdjMzBhNmVjOTlhNTQ0NjFkYmZlNmVlMGImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.2J3NmIxv-59EIRtfDzSwLn7GKKN1Ctw10p1DmG8LfOc)
![Home](https://private-user-images.githubusercontent.com/77167918/367052375-32416526-1193-4381-a6fe-ebaea96b5ea6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjE0NDUsIm5iZiI6MTczODkyMTE0NSwicGF0aCI6Ii83NzE2NzkxOC8zNjcwNTIzNzUtMzI0MTY1MjYtMTE5My00MzgxLWE2ZmUtZWJhZWE5NmI1ZWE2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA5MzkwNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI5YWZmOTE2ZDQ2YzliNmQxMDk0NWU4YzBkODZlM2YzMWNkZjNmZDBjZjk1ZmE3NGIwNGI2MmJmN2M0OGRhNDMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.tXoRlLcnnUInQwkTzOB1KTXKAS7oqM6kDYJwwP2-_4A)
![Home](https://private-user-images.githubusercontent.com/77167918/367052316-3fcbfc17-90bf-48b9-9e6e-a863e5b6a8dd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjE0NDUsIm5iZiI6MTczODkyMTE0NSwicGF0aCI6Ii83NzE2NzkxOC8zNjcwNTIzMTYtM2ZjYmZjMTctOTBiZi00OGI5LTllNmUtYTg2M2U1YjZhOGRkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA5MzkwNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWFlZTZjMDA4N2ZjNDJkOTgyNmFiM2UwNjg5NTQ4MDdiNTEyODlkZDMyYmFjNDYzYjM3ODgwNmJhMTUxZDE5YTkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hIJLPnSM-t-YHGuDBMG0BcAj_Mp1F697fE0WKtHRr2Y)
![Home](https://private-user-images.githubusercontent.com/77167918/367052424-383f5582-ffd8-4709-a7bf-afd13ef9a72a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjE0NDUsIm5iZiI6MTczODkyMTE0NSwicGF0aCI6Ii83NzE2NzkxOC8zNjcwNTI0MjQtMzgzZjU1ODItZmZkOC00NzA5LWE3YmYtYWZkMTNlZjlhNzJhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA5MzkwNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg5ODMxNzQ0ODE4ODBlN2U5NTkzYTk5YTAyOTVlMThmMDg3ZDAxMWE3MDQ1M2FmOTBjN2ZjYmQ2NGZkZDAxOTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.GCQYiuiE2DBeaPXHgvPUgHOsxd_gqOGIqx860jPV3ac)
![Home](https://private-user-images.githubusercontent.com/77167918/367052470-eaec762d-26dd-4a20-8732-60233be7b1e4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjE0NDUsIm5iZiI6MTczODkyMTE0NSwicGF0aCI6Ii83NzE2NzkxOC8zNjcwNTI0NzAtZWFlYzc2MmQtMjZkZC00YTIwLTg3MzItNjAyMzNiZTdiMWU0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA5MzkwNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZlMmFiNDc0YjM4ZTNjMWI1ZTc0Yzg0YTExMzI0NjNkODA1MGM4MjNmNjY3YTZkZGMxZWU3MWNkYjMzY2VjMmEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.HiLtABn2wxZhk7PC-fqa4L_YQV8U17bUe_HUuYgy0RM)
![Home](https://private-user-images.githubusercontent.com/77167918/367052520-37a7bb46-6378-4bdd-a643-8aaa4c975796.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjE0NDUsIm5iZiI6MTczODkyMTE0NSwicGF0aCI6Ii83NzE2NzkxOC8zNjcwNTI1MjAtMzdhN2JiNDYtNjM3OC00YmRkLWE2NDMtOGFhYTRjOTc1Nzk2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA5MzkwNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUwZTVjNjFmOWZlMWEyZWIzY2FjZDQ5MTY4M2ZkNjk2NmUwNDQ0ZDZmYWY4N2EzZDQxMGUxZWRkZDQ4MWNhZjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.4Q5SD53RG00DImrTNWeM-9auqpafspZE9pbb7y-BGHQ)
![Home](https://private-user-images.githubusercontent.com/77167918/367052533-6176d565-5bb6-4a24-8ec2-246ffd30d3bb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjE0NDUsIm5iZiI6MTczODkyMTE0NSwicGF0aCI6Ii83NzE2NzkxOC8zNjcwNTI1MzMtNjE3NmQ1NjUtNWJiNi00YTI0LThlYzItMjQ2ZmZkMzBkM2JiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA5MzkwNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTIwMzI1NTYxNWMzYjZhNjA2Y2YwY2FmNzQxZWI1ZTZhZmU2Njk5MmI2MDkwMzllYjlhZmJlZDQyYjFiNjgyNjYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.EkZhdVo4h1Um_8IYa56gs3SH20bvP9DcqviL9zsQ-Dg)
![Home](https://private-user-images.githubusercontent.com/77167918/367053284-2bca7f5f-d018-4638-95d7-08d0e9e2d842.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjE0NDUsIm5iZiI6MTczODkyMTE0NSwicGF0aCI6Ii83NzE2NzkxOC8zNjcwNTMyODQtMmJjYTdmNWYtZDAxOC00NjM4LTk1ZDctMDhkMGU5ZTJkODQyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA5MzkwNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNkODUxODVjNzY1MWI3MmEyOTRlYTQxNWI1ZjkyYjBkNjA4NGU0ZmViNDIyZTdjMzU1NDliODAxZGRiODBhYmEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CTYuUObzXB_Y3JIykgxY8BnivYhPyo2IowzFzHafYWY)
This project was created following the Flutter Advanced Course - Clean Architecture With MVVM by Mina Farid on Udemy.