A full-featured, production-ready e-commerce mobile application built with Flutter, following Clean Architecture principles. Shopy covers the entire shopping journey — from onboarding and authentication to product discovery, cart management, real-time checkout with Stripe payments, and order tracking.
![]() Splash |
![]() Onboarding |
![]() Login |
![]() Sign Up |
![]() Forgot Password |
![]() Home |
![]() Products Filter |
![]() Search |
![]() Product Details |
![]() Reviews |
![]() Wishlist |
![]() Cart |
![]() Payment Methods |
![]() Add Payment Card |
![]() Saved Addresses |
![]() No Addresses |
![]() Add New Address |
![]() Checkout |
![]() Notifications |
![]() Account |
- Splash screen with session persistence via SharedPreferences
- Animated onboarding flow
- Email / Password sign-up and login
- Google Sign-In and Facebook Login (OAuth)
- OTP-based password reset with hashed code verification
- Home feed with product listings fetched from Cloud Firestore
- Category filtering
- Full-text product search with recent search history
- Product detail page with image, price, size/color variants, and customer reviews
- Wishlist / Save for later
- Add to cart, adjust quantities, remove items
- Checkout flow with:
- Saved delivery addresses (add / select / manage)
- Google Maps integration — visualize delivery location with polyline routing
- Device GPS via Geolocator
- Multiple payment methods (Stripe card payments)
- Add new credit/debit cards through Stripe
- Place order → stored in Firestore
- My Orders screen with order history
- My Details — view and update profile
- Notifications page
- FAQs and Help Center pages
- Logout
| Layer | Technology |
|---|---|
| UI Framework | Flutter 3 / Dart |
| State Management | flutter_bloc (Cubit) |
| Architecture | Clean Architecture (Data · Domain · Presentation) |
| Dependency Injection | get_it |
| Functional Programming | dartz (Either, Option) |
| Backend | Firebase (Auth, Cloud Firestore, Remote Config, Cloud Functions) |
| Payments | Stripe (flutter_stripe) |
| Maps & Location | Google Maps Flutter, Geolocator, flutter_polyline_points |
| Auth Providers | Google Sign-In, Flutter Facebook Auth |
| Networking | http |
| Image Loading | cached_network_image |
| Local Storage | shared_preferences |
| Network State | connectivity_plus |
| Vector Graphics | flutter_svg |
| Equality | equatable |
The project follows Clean Architecture with a feature-first folder structure. Each feature is self-contained across three layers:
lib/
├── core/
│ ├── di/ # GetIt service locator setup
│ ├── theme/ # Colors, text styles, app theme
│ ├── constants/ # Routes, cubit providers
│ ├── session/ # Auth session management
│ ├── errors/ # Failures & exceptions
│ └── widgets/ # Shared UI components
│
└── features/
├── welcome/ # Splash & onboarding
├── auth/ # Login, signup, OTP, password reset
├── home/ # Product listing, search, cart, wishlist
├── checkout/ # Address, payment, Stripe, Google Maps
└── Order/ # Order history
Each feature contains:
Data/— models, mappers, data sources, repository implementationsDomain/— entities, repository interfaces, use casesPresentation/— screens, cubits, widgets
- Flutter SDK
^3.10.1 - Dart SDK
^3.10.1 - A Firebase project with Authentication, Firestore, and Remote Config enabled
- A Stripe account — store the publishable key in Firebase Remote Config under the key
stripe_publishable_key - Google Maps API key configured for Android and iOS
# Clone the repository
git clone https://github.com/eslammadhoun/shopy.git
cd shopy
# Install dependencies
flutter pub get
# Run the app
flutter runMake sure your
google-services.json(Android) andGoogleService-Info.plist(iOS) are placed in their respective platform directories before running.
- Remote Config for secrets — Stripe publishable key is fetched at app startup from Firebase Remote Config, keeping sensitive keys out of source code.
- OTP hashing — Password-reset OTP codes are hashed with
cryptobefore comparison, preventing plaintext exposure. - Dartz Either — All repository and use-case return types use
Either<Failure, T>, making error handling explicit and eliminating uncaught exceptions from business logic. - Connectivity awareness — Network state is observed globally; offline states are handled gracefully.
- Mapper pattern — Separate mapper classes decouple Firestore models from domain entities, keeping the domain layer free of Firebase dependencies.
- Android
- iOS
This project is for portfolio and educational purposes.



















