A Flutter expense and income tracking application built with Clean Architecture principles.
This project follows Clean Architecture with three main layers:
- Data Layer: API clients, repositories, request/response models
- Domain Layer: Business logic, entities, cubits, repository interfaces
- Presentation Layer: UI components, screens, widgets
lib/
├── common/ # Shared utilities and components
│ ├── constants/
│ ├── data/
│ ├── domain/
│ └── presentation/
│ ├── ui_utils/
│ └── widgets/
├── core/ # Core functionality
│ ├── di/ # Dependency injection
│ ├── network/ # Network client and API setup
│ ├── failures/ # Error handling
│ ├── extensions/ # Dart extensions
│ ├── providers/ # Service providers
│ └── utils/ # Utility functions
├── features/ # Feature modules
│ └── example/
│ ├── data/
│ │ ├── models/
│ │ ├── repositories/
│ │ └── datasources/
│ ├── domain/
│ │ ├── entities/
│ │ ├── cubits/
│ │ └── repositories/
│ └── presentation/
│ ├── screens/
│ └── widgets/
├── gen/ # Generated files (localization, code generation)
└── l10n/ # Localization files
assets/
├── fonts/ # Font files
├── images/ # Image assets
└── svgs/ # SVG files
- Flutter SDK (>= 3.0.0)
- Dart SDK (>= 3.0.0)
- Clone the repository:
git clone https://github.com/shihabkandil/extro.git
cd extro- Install dependencies:
flutter pub get- Run code generation:
flutter pub run build_runner build --delete-conflicting-outputs
flutter gen-l10n-
Configure OAuth providers (optional for development):
- See docs/OAUTH_SETUP.md for Google and Apple Sign-In setup
- Configure OAuth credentials in Google Cloud Console and Apple Developer Portal
-
Run the app:
flutter run- State Management: flutter_bloc
- Dependency Injection: get_it + injectable
- Immutable Models: freezed
- Network: dio
- Functional Programming: dartz
- Localization: flutter_localizations
- Authentication: google_sign_in + sign_in_with_apple
- OAuth Authentication: Sign in with Google and Apple (no Firebase required)
- Clean Architecture: Separation of concerns with data, domain, and presentation layers
- Type-safe Models: Immutable data structures using Freezed
- Error Handling: Comprehensive error handling with Either pattern
- Internationalization: Multi-language support ready
This project uses code generation for:
- Freezed models
- JSON serialization
- Dependency injection
- Localization
Run the following command after making changes:
flutter pub run build_runner build --delete-conflicting-outputsOr use watch mode for development:
flutter pub run build_runner watch --delete-conflicting-outputsAdd translations to lib/l10n/app_en.arb and run:
flutter gen-l10nSee the comprehensive documentation in the docs/ directory:
- ARCHITECTURE.md - Architecture overview and patterns
- CODING_GUIDELINES.md - Coding conventions and best practices
- FEATURE_GUIDE.md - Step-by-step feature implementation guide
- SETUP.md - Development environment setup
This project is licensed under the MIT License.