Back to archive
IV. Client Builds & Logistics Platformssupportingleadclient anonymised

Pizza Brand Mobile App (Flutter)

Customer-facing mobile food-delivery app for Restaurant chain (UZ) (iOS+Android) on Flutter: catalog, cart, checkout with zone/terminal selection on Yandex Maps, Payme payments, tracking, multilingual — a live production app, developed ~3.7 years.

Status
maintained
Period
2021-08-30 → 2025-04-19
AI sessions
Stack
Languages
Dart
Frameworks · Infra
FlutterMobXflutter_blocflutter_hooksHiveget_itYandex MapKitFirebaseeasy_localization
§01

Overview

  • What it is: B2C food-delivery app for Restaurant chain (UZ). The customer picks a city/branch (terminal), delivery type (delivery/pickup) bound to a geo-zone via Yandex Maps, assembles the cart, places the order, pays (Payme), tracks status, accrues bonus points, reads news/promos. Version in pubspec — 1.0.70+70.
  • Type / status / role: mobile (Flutter, iOS+Android) · maintained (last commits — April 2025) · lead — the user is the top contributor (~108 of 268), team of 3 (with shahaa/Shahzod ~95 and Bobur ~63).
  • Active period: 2021-08-30 → 2025-04-19 — nearly 4 years of continuous evolution of a single product (Flutter SDK migrations, dependency upgrades, features). Longevity = strong signal of maintaining a real product.
§02

Stack

  • Languages: Dart (Flutter, SDK >=2.17.0).
  • Frameworks/libraries:
  • *State management (mixed):* MobX (flutter_mobx, mobx_codegen) + flutter_bloc (9.x) + flutter_hooks — three reactive approaches in one project (legacy of long evolution).
  • *Local storage:* Hive + hive_flutter + hive_generator — typed adapters via codegen (@HiveType/@HiveField, see models/basket.dart, terminals.dart), shared_preferences.
  • *Navigation/DI:* auto_route (codegen routing) + get_it (service locator).
  • *Maps/geo:* yandex_mapkit + geolocator — address/delivery zone selection, tracking.
  • *Auth:* local packages authentication_repository + user_repository (repository pattern, packages/ + lib/src/), otp_autofill, intl_phone_number_input, pin_code_fields — phone+OTP login.
  • *Firebase:* core + crashlytics + messaging (push).
  • *i18n:* easy_localization (+loader) — RU/UZ/EN (fields nameUz/nameEn in models).
  • *Forms/UI:* flutter_form_builder + form_builder_validators, flutter_platform_widgets (iOS/Android adaptive), flutter_html/simple_html_css, lots of UI packages (carousel, staggered animations, rating bar, modal sheets).
  • *Updates:* in_app_update + upgrader — forced/flexible updates.
  • Infra/deploy: native builds Android (Gradle) + iOS (CocoaPods), flutter_native_splash, flutter_launcher_icons, Firebase (GoogleService-Info.plist, firebase_options.dart). Backend — external (Restaurant chain (UZ) API), the app is client-side.
  • Data: Hive (offline cache of cart/city/terminals/user), REST via http.
  • Notable tooling: patches/country_pickers — local dependency patch; dependency_overrides (fix flutter_plugin_android_lifecycle for old Android SDK) — real work with version conflicts.
§03

What was shipped

Commit messages are often short/junk ("changed version", "dd") — conclusions are drawn from code.

  • Catalog and cart: products, sections, related products, modifiers; cart on Hive (Basket typeId 2 — encodedId/lineCount/totalPrice) with offline persistence.
  • Delivery/geo: terminal and zone selection on Yandex Maps (widgets/delivery/*: delivery_modal, terminals_modal, pickup), geolocation, delivery/pickup time calculation per terminal.
  • Payment: per-terminal Payme integration (fields paymeActive, paymeMerchantId, paymeSecureKey, paymeTestMode, paymePrint on Terminals) — different merchant keys per branch.
  • Auth: phone+OTP with autofill of the code, repository pattern in separate packages.
  • Update service: services/app_update_service.dart (~14.5 KB) — singleton on top of in_app_update: immediate/flexible update, restart dialog with re-show guard (_isRestartDialogShowing), debug-only emulation (kDebugMode gate).
  • Reliability: in main.dart, Crashlytics is wired into FlutterError.onError + PlatformDispatcher.instance.onError (async error interception), background push handler.
  • Volume: 268 commits over ~3.7 years; 123 .dart files in lib/, ~13 domain widget sections.
§04

Technical challenges

Confirmed by code/files:

  • Offline-first on Hive with codegen (models/*.dart + *.g.dart): domain models (Basket, Terminals, City, DeliveryType, PayType, Stock, User…) serialize into Hive with typed adapters (@HiveType(typeId: N)), field numbering managed manually with skips (e.g. in Terminals field 20 is skipped) — careful local-DB schema management as the app evolves. → understanding local-storage migrations.
  • Multi-branch payment configuration (models/terminals.dart): each terminal carries its own Payme credentials and test/prod mode — the app effectively works as a multi-tenant across points of sale. → modeling a real retail domain.
  • Production-grade handling of update edge cases (services/app_update_service.dart): singleton, idempotent dialog (flag against duplicates), graceful degradation with a toast when immediate-update is unavailable, isolation of the test path behind kDebugMode. → attention to production UX edge cases.
  • End-to-end crash reporting (main.dart): both synchronous Flutter errors and async errors via PlatformDispatcher.onError go to Crashlytics as fatal — full coverage. → operational maturity.
  • Adaptivity and i18n: flutter_platform_widgets (native look on iOS/Android) + easy_localization across 3 languages with localized fields directly in models. → working for a real multilingual market (Uzbekistan).
  • Dependency management: local patch of country_pickers + dependency_overrides for old Android SDK — resolving conflicts in a large package tree. → experience maintaining a long-lived Flutter project.
§05

AI-assisted development

  • Sessions found: 0. Full-path normalization did not yield a directory; no neighboring/nested sessions either.
  • What was done with AI: no data — the project developed before active use of Claude Code (2021–2025).
  • AI-workflow patterns: none.
§06

Achievements & metrics

  • Longevity: ~3.7 years of a single production app, 268 commits, version 1.0.70.
  • Codebase scale: 123 .dart files, ~13 domain widget sections, ~40 models.
  • Real users: public delivery app for Restaurant chain (UZ) (Uzbekistan), real payments (Payme), push, crash analytics.
  • Cross-platform: unified codebase for iOS + Android with adaptive UI.
§07

Contributors

git shortlog · all branches

  1. Dave93108
  2. shahzodsalimsakov95
  3. Boburt63
  4. User2
4 contributors268 commits total
Currently

Open to Senior / Staff engineering roles and selective freelance — production AI, platform, and full-stack work.

Get in touch