The Flowery Tracking App is a modern Flutter-based delivery management solution designed for drivers within the Flowery ecosystem.
It empowers drivers to receive, navigate, and complete delivery tasks seamlessly β building a reliable connection between stores and customers.
Developed with scalability, speed, and real-time synchronization in mind, the app integrates Firebase Firestore to keep driver and customer data perfectly aligned throughout the delivery process.
The project also includes robust localization support, dependency injection, and automated testing and CI/CD pipelines for continuous quality assurance.
Its architecture follows a feature-driven, layered structure β organizing logic into presentation, domain, and data layers β while connecting with both REST APIs and Firebase Firestore for smooth, live data flow.
- Flutter (UI)
- Dart (language)
- State management:
flutter_bloc(Bloc/Cubit patterns) - Dependency injection:
get_it+injectable(generateddi.config.dart) - Networking:
dio+retrofit(API clients & JSON serialization) - Serialization / Codegen:
json_serializable,build_runner+ code generation - Local storage / security:
shared_preferences,flutter_secure_storage - Other libraries:
cached_network_image,flutter_svg,lottie,location,pin_code_fields,logger,pretty_dio_logger,equatable, etc. - Testing:
flutter_test,bloc_test,mockitofor unit & widget tests - CI / Quality: GitHub Actions workflows for linting, SonarCloud, PR title checks, unit tests, and Fastlane for distribution
- Firebase Firestore: Real-time synchronization between driver and user apps.
The project follows a modern, layered and feature-driven architecture:
- Feature-first layout (e.g.,
lib/features/<feature>/...) β each feature contains itsdata,domain, andpresentationlayers. - Domain layer: Entities and use-cases (pure Dart models & business rules).
- Data layer: DTOs, remote/local data sources, repositories, and mappers to domain entities.
- Presentation layer: Flutter UI using Bloc/Cubit for state management (views, pages, widgets).
- Dependency injection:
get_itconfigured and code-generated viainjectable(di.config.dart). - Internationalization: ARB-based localization with
l10n.yamlconfiguration (generatedapp_localizations.dart).
- Onboarding Flow: Introduction screens guiding drivers about the app purpose.
- Login / Apply:
- Registered drivers can log in with email and password.
- New drivers can apply for registration through a dedicated flow.
- Forgot Password: Reset password easily using email verification and OTP flow.
-
Home Screen (Pending Orders):
- Displays a real-time list of available delivery orders.
- Drivers can accept an order directly from the list.
- Once accepted, the order is locked until delivered.
-
Order Details Screen:
- View detailed information including:
- User Details
- Store Details
- Order Details
- Direct navigation to map views:
- Store Map: Displays the route from the driverβs current location to the store.
- User Map: Displays the route from the store to the customerβs location.
- View detailed information including:
-
Accepted Orders:
- Real-time updates from Firestore.
- The driver cannot accept new orders until the current one is delivered.
- Orders History Screen:
- Displays all Completed and Canceled orders.
- Each order includes detailed information such as user details, store details, and delivery time.
- Drivers can open any previous order to view its Order Details Screen.
- Profile Screen:
- View and edit personal information (name, phone number, etc.).
- Change the app language between English and Arabic.
- Log out securely anytime.
-
Run unit & widget tests:
flutter test -
Mocks are generated using
mockito(see generated*.mocks.dartfiles). -
CI runs tests via GitHub Actions and also runs
flutter analyzefor static analysis.
lib/
βββ config/ # Global app configurations
β βββ routing/ # Navigation & route management
β βββ theme/ # Light/Dark themes setup
βββ core/ # Shared base layer used by all features
β βββ components/ # Reusable custom widgets
β βββ di/ # Dependency Injection (Injectable setup)
β βββ errors/ # Failure models + Safe API call handler
β βββ helpers/ # Toasts, dialogs, spacing helpers, validators
β βββ l10n/ # Localization (EN/AR) files and setup
β βββ network/ # Networking base (Dio interceptors, client setup)
β βββ providers/ # Theme & locale providers
β βββ services/ # App level services (Token, Firebase, etc.)
β βββ utils/ # App constants, keys, assets utilities
βββ features/ # Modular features (Fully independent)
β βββ auth/
β β βββ data/
β β β βββ data_source/ # Remote/Local data sources
β β β βββ models/ # DTOs with json_serializable
β β β βββ repositories_impl/ # Repository implementations
β β βββ domain/
β β β βββ entities/ # Business entities
β β β βββ repositories/ # Repository contracts
β β β βββ usecases/ # Auth use cases
β β βββ presentation/
β β βββ view_models/ # BLoC / Cubit state management
β β βββ screens/ # UI pages
β β βββ widgets/ # Feature-specific widgets
β β
β βββ home/ # Same structure for each feature
β βββ product/
β βββ cart/
βββ firebase_options.dart # Firebase configuration file
βββ main.dart # Application entry point
- Install Flutter (stable channel recommended)
- Get dependencies:
flutter pub get- Generate code:
flutter pub run build_runner build --delete-conflicting-outputs- Run the app:
flutter run- Build an APK:
flutter build apk --release- GitHub Actions for linting, pull request title, branch name, unit testing, soner qube, building & distribution
- Fastlane workflow for Firebase App Distribution
Choose a license (MIT recommended)
























