Flutly is a demo e-commerce mobile application built with Flutter to showcase clean architecture, feature-based organization, and production-ready patterns.
β οΈ This app is for demonstration purposes only. No real payments, orders, or transactions are processed.
Flutly simulates a complete shopping experience, including authentication, product browsing, cart management, and checkout.
The project is structured to reflect real-world mobile applications, prioritizing:
- Feature-based organization
- Clear separation of concerns
- Scalable navigation and state management
- Maintainable and testable architecture
![]() |
![]() |
![]() |
![]() |
![]() |
- Authentication: Email/password and social sign-in.
- Dynamic Content: Home integrated with Sanity CMS.
- Product Catalog: Search, filtering, and product details.
- Cart & Checkout: Local state management with mocked checkout flow.
- Feedback Loop: Built-in bug reporting flow.
You can install the Flutly app directly on your device via the closed test builds.
π Flutly β Closed Test Page
- Flutter & Dart
- State management:
flutter_bloc - Navigation:
go_router - Dependency injection:
get_it - Networking:
dio - Local storage:
shared_preferences,flutter_secure_storage - Forms:
reactive_forms - Localization:
easy_localization - Backend Services: Firebase (Auth, Firestore, Analytics) & Sanity CMS.
Flutly follows a feature-first Clean Architecture approach.
graph TD
subgraph Presentation ["<b>Presentation Layer</b>"]
UI[Pages & Widgets]
State[BLoC / Cubit]
end
subgraph Domain ["<b>Domain Layer</b>"]
UC[Use Cases]
RC[Repository Interfaces]
E[Entities]
end
subgraph Data ["<b>Data Layer</b>"]
RI[Repository Implementation]
DS[Data Sources]
M[Data Models]
end
subgraph Ext ["Firebase / Sanity / DummyJSON"]
end
subgraph Lo ["Local Storage"]
end
%% Request
UI --> State
State --> UC
State --> RC
UC --> RC
RI --> RC
%% Response
Ext --> DS
Lo --> DS
DS --> M
M --> RI
RI .-> E
Each feature (e.g., auth, catalog, checkout) is self-contained:
lib/
βββ app/
β βββ core/ # Routing, DI, HttpClient, Storage
β βββ shared/ # Common Widgets, Theme, Extensions
β βββ features/
β βββ auth/ # Feature: Authentication
β βββ catalog/ # Feature: Product Browsing
β βββ cart/ # Feature: Shopping Cart
β βββ ...
βββ main.dart
βββ firebase_options.dart
I chose flutter_bloc for its strict separation of presentation and business logic. It provides a predictable state stream, making it easier to trace bugs and write unit tests for every user interaction.
To make this portfolio project easy to run for recruiters and developers, I implemented a Demo Mode.
- Challenge: The app needed to function fully without requiring valid Firebase credentials.
- Solution: Based on environment variables, the Dependency Injection (GetIt) swaps the real Firebase implementations for Mock implementations at runtime. This ensures the UI code remains completely agnostic of the data source.
- Flutter SDK (
sdk: ^3.9.2) - Android Studio or Xcode
- CocoaPods (for iOS)
Environment values are provided via --dart-define. The project includes an env.example.json file preconfigured to run without any backend setup.
By default, Flutly runs in demo mode. No Firebase project or credentials are needed. Authentication is simulated, and data is handled locally.
- Create the env file:
cp env.example.json env.prod.json- Run the app:
flutter run --dart-define-from-file=env.prod.jsonTo enable real backend integration:
- Open
env.prod.jsonand set:
"USE_FIREBASE": true-
Create a Firebase project (Auth + Firestore enabled).
-
Add configuration files (google-services.json / GoogleService-Info.plist).
-
Reconfigure via FlutterFire:
flutterfire configure- Run the app:
flutter run --dart-define-from-file=env.prod.json# Install dependencies
flutter pub get
# iOS setup
cd ios && pod installThe project prioritizes test coverage for Domain logic, Use Cases, and Repositories.
flutter testTo generate coverage data and HTML report:
flutter test --coverage
genhtml coverage/lcov.info -o coverage/htmlNote:
genhtmlis part oflcov.
- macOS:
brew install lcov- Ubuntu/Debian:
sudo apt-get install lcov
Current line coverage: 80%+
- Assets:
assets/icons,assets/images - Localization: Handled via
easy_localization(Current locale:en).
Gabriel Peres Bernes Mobile Software Engineer β Flutter Specialist
LinkedIn: https://www.linkedin.com/in/gabriel-peres-bernes/
Email: bernes.dev@gmail.com
This project is intended for educational and demonstration purposes only and does not represent a real commercial product.




