Wizard Shop Flutter E-Commerce App
Delivered a maintainable, testable mobile app across iOS and Android with zero secret leakage and isolated environment configurations.
Business Context
Mobile e-commerce apps often become monolithic and hard to test due to tight coupling between UI, business logic, and network layers — especially across multiple environments (dev, staging, production).
The Solution
A Flutter application built using Clean Architecture and BLoC, strictly decoupling UI, state management, and domain logic for maximum testability.
- 4 isolated build environments (dev/uat/demo/prod) using compile-time Dart defines
- Resilient Dio networking layer with automatic retries and structured error normalization
- BLoC state management with strict separation of UI, state, and domain
- RESTful API integration with domain error normalization
Architecture Overview
The app follows Clean Architecture with strict layer separation. BLoC manages all UI state transitions reactively. Dio interceptors handle token refresh, retries, and error normalization globally, preventing boilerplate across screens.
Tech Stack & Reasoning
| Technology | Why it was used |
|---|---|
| Flutter | Single codebase compiling to native iOS and Android applications. |
| BLoC | Reactive state management with predictable, testable state transitions. |
| Dio | HTTP client with interceptor support for retry logic, logging, and error normalization. |
| Dart Defines | Compile-time environment injection ensuring zero secret leakage across environments. |
Key Features
- 4 fully isolated build environments (dev/uat/demo/prod)
- Dio interceptors with automatic retry and domain error normalization
- BLoC-driven reactive UI with predictable state management
- Clean Architecture enforcing strict layer separation
Engineering Highlights
Architected using Clean Architecture to strictly decouple UI, state, and domain logic for maximum testability.
Engineered a resilient Dio networking layer with automatic retries, structured logging, and error normalization.
Configured 4 isolated build environments using compile-time Dart defines to ensure zero secret leakage.
Challenges & Solutions
Managing consistent API error handling across dozens of screens without code duplication.
Centralized all error normalization inside Dio interceptors at the data layer.
Impact: Eliminated duplicated error handling across all features and ensured consistent UX for API failures.
Performance Metrics
What I Learned
- •Enforcing Clean Architecture boundaries in a Flutter project
- •Configuring multi-environment builds with Dart compile-time defines
- •Building resilient, interceptor-based networking layers with Dio
System Interface

Want to see more projects?
Explore my other recent work to see a broader range of system architectures and full-stack solutions.
