§01
Обзор
- Что это: B2C-приложение доставки еды для Restaurant chain (UZ). Клиент выбирает город/филиал (терминал), тип доставки (доставка/самовывоз), привязанный к гео-зоне через Яндекс Карты, собирает корзину, оформляет заказ, оплачивает (Payme), отслеживает статус, копит бонусные баллы, читает новости/акции. Версия в pubspec —
1.0.70+70. - Тип / статус / роль: mobile (Flutter, iOS+Android) · maintained (последние коммиты — апрель 2025) · lead — пользователь топ-контрибьютор (~108 из 268), команда из 3 человек (вместе с shahaa/Shahzod ~95 и Bobur ~63).
- Активный период: 2021-08-30 → 2025-04-19 — почти 4 года непрерывной эволюции одного продукта (миграции Flutter SDK, апгрейды зависимостей, фичи). Долгожительство = сильный сигнал сопровождения реального продукта.
§02
Стек
- Языки: Dart (Flutter, SDK
>=2.17.0). - Фреймворки/библиотеки:
- *Управление состоянием (смешанное):* MobX (
flutter_mobx,mobx_codegen) + flutter_bloc (9.x) + flutter_hooks — три реактивных подхода в одном проекте (наследие долгой эволюции). - *Локальное хранилище:* Hive +
hive_flutter+hive_generator— типизированные адаптеры через codegen (@HiveType/@HiveField, см.models/basket.dart,terminals.dart),shared_preferences. - *Навигация/DI:*
auto_route(codegen-роутинг) +get_it(service locator). - *Карты/гео:* yandex_mapkit +
geolocator— выбор адреса/зоны доставки, трекинг. - *Аутентификация:* локальные пакеты
authentication_repository+user_repository(паттерн repository,packages/+lib/src/),otp_autofill,intl_phone_number_input,pin_code_fields— вход по телефону+OTP. - *Firebase:* core + crashlytics + messaging (push).
- *i18n:* easy_localization (+loader) — RU/UZ/EN (поля
nameUz/nameEnв моделях). - *Формы/UI:*
flutter_form_builder+form_builder_validators,flutter_platform_widgets(адаптивность iOS/Android),flutter_html/simple_html_css, множество UI-пакетов (carousel, staggered-анимации, rating bar, modal sheets). - *Обновления:*
in_app_update+upgrader— принудительные/гибкие обновления. - Инфраструктура/деплой: нативные сборки Android (Gradle) + iOS (CocoaPods),
flutter_native_splash,flutter_launcher_icons, Firebase (GoogleService-Info.plist,firebase_options.dart). Бэкенд — внешний (Restaurant chain (UZ) API), приложение — клиентская часть. - Данные: Hive (офлайн-кэш корзины/города/терминалов/пользователя), REST через
http. - Заметный тулинг:
patches/country_pickers— локальный патч зависимости;dependency_overrides(фиксflutter_plugin_android_lifecycleпод старый Android SDK) — реальная работа с конфликтами версий.
§03
Что реализовано
Сообщения коммитов часто короткие/мусорные ("changed version", "dd") — выводы делаются по коду.
- Каталог и корзина: продукты, разделы, сопутствующие товары, модификаторы; корзина на Hive (
BaskettypeId 2 — encodedId/lineCount/totalPrice) с офлайн-персистентностью. - Доставка/гео: выбор терминала и зоны на Яндекс Картах (
widgets/delivery/*: delivery_modal, terminals_modal, pickup), геолокация, расчёт времени доставки/самовывоза по терминалу. - Оплата: пофилиальная интеграция Payme (поля
paymeActive,paymeMerchantId,paymeSecureKey,paymeTestMode,paymePrintнаTerminals) — разные merchant-ключи для каждого филиала. - Аутентификация: телефон+OTP с автозаполнением кода, паттерн repository в отдельных пакетах.
- Сервис обновлений:
services/app_update_service.dart(~14.5 KB) — синглтон поверхin_app_update: immediate/flexible-обновление, диалог перезапуска с защитой от повторного показа (_isRestartDialogShowing), эмуляция только в debug (kDebugMode-гейт). - Надёжность: в
main.dartCrashlytics подключён кFlutterError.onError+PlatformDispatcher.instance.onError(перехват асинхронных ошибок), фоновый push-хендлер. - Объём: 268 коммитов за ~3.7 года; 123 .dart-файла в
lib/, ~13 доменных секций виджетов.
§04
Технические челленджи
Подтверждено кодом/файлами:
- Offline-first на Hive с codegen (
models/*.dart+*.g.dart): доменные модели (Basket, Terminals, City, DeliveryType, PayType, Stock, User…) сериализуются в Hive типизированными адаптерами (@HiveType(typeId: N)), нумерация полей ведётся вручную с пропусками (например, в Terminals пропущено поле 20) — аккуратное управление схемой локальной БД по мере развития приложения. → понимание миграций локального хранилища. - Мультифилиальная конфигурация оплаты (
models/terminals.dart): каждый терминал несёт собственные Payme-креды и test/prod-режим — приложение фактически работает как multi-tenant по точкам продаж. → моделирование реального ритейл-домена. - Production-grade обработка edge-кейсов обновления (
services/app_update_service.dart): синглтон, идемпотентный диалог (флаг против дублей), graceful degradation с тостом, когда immediate-обновление недоступно, изоляция тестового пути заkDebugMode. → внимание к продакшн-UX edge-кейсам. - Сквозной crash reporting (
main.dart): и синхронные ошибки Flutter, и асинхронные черезPlatformDispatcher.onErrorуходят в Crashlytics как fatal — полное покрытие. → операционная зрелость. - Адаптивность и i18n:
flutter_platform_widgets(нативный вид на iOS/Android) + easy_localization на 3 языках с локализованными полями прямо в моделях. → работа под реальный мультиязычный рынок (Узбекистан). - Управление зависимостями: локальный патч
country_pickers+dependency_overridesпод старый Android SDK — разрешение конфликтов в большом дереве пакетов. → опыт сопровождения долгоживущего Flutter-проекта.
§05
AI-разработка
- Найдено сессий: 0. Нормализация полного пути не дала директории; соседних/вложенных сессий тоже нет.
- Что делалось с AI: данных нет — проект развивался до активного использования Claude Code (2021–2025).
- Паттерны AI-воркфлоу: отсутствуют.
§06
Достижения и метрики
- Долгожительство: ~3.7 года одного продакшн-приложения, 268 коммитов, версия 1.0.70.
- Масштаб кодовой базы: 123 .dart-файла, ~13 доменных секций виджетов, ~40 моделей.
- Реальные пользователи: публичное приложение доставки для Restaurant chain (UZ) (Узбекистан), реальные платежи (Payme), push, crash-аналитика.
- Кроссплатформенность: единая кодовая база для iOS + Android с адаптивным UI.