Разработка мобильного приложения для доставки еды (клиент)
Клиентское приложение доставки еды — самый конкурентный сегмент в мобильной разработке. Пользователь сравнивает его не с предыдущей версией, а с Яндекс.Едой и Delivery Club. Retention зависит от скорости открытия, плавности скролла меню и точности отслеживания курьера. Любой технический провал здесь — удаление приложения.
Производительность как архитектурный приоритет
Меню ресторана — это список с изображениями. Казалось бы, элементарно. На практике: 80-100 позиций с фотографиями, категории с горизонтальным скроллом, анимация добавления в корзину — и на Snapdragon 660 всё это начинает дёргаться при быстром скролле.
Решение: кешируем изображения через cached_network_image с disk cache, отдаём WebP-версии с бэкенда (Sharp на Node.js или Imageflow), ленивая загрузка через ListView.builder, предзагрузка следующих 5 позиций через precacheImage. Анимация добавления в корзину — Hero-анимация с миниатюрой, без полноэкранных overlay-эффектов.
Время до интерактивности при cold start — критичная метрика. Хранение последнего состояния меню локально (Hive): при открытии показываем кешированное меню мгновенно, фоном обновляем с сервера. Пользователь видит контент, а не спиннер.
Корзина и оформление заказа
Корзина — это состояние, которое должно переживать: сворачивание приложения, перезагрузку телефона, смену Wi-Fi на мобильный интернет. Bloc + HydratedBloc (автопереключение на SharedPreferences) решает это за один вечер.
Оформление заказа — воронка, где каждый лишний шаг снижает конверсию. Оптимальный флоу: корзина → адрес (из saved addresses или новый) → время доставки → способ оплаты → подтверждение. Максимум 4 экрана. Сохранённые адреса через Google Places API Autocomplete или Dadata — автодополнение при вводе.
Оплата: ЮКасса с Apple Pay / Google Pay — это не опция, это требование. Пользователи, которые привыкли платить одним нажатием, не будут вводить 16-значный номер карты. Интеграция Google Pay через google_pay Flutter plugin, Apple Pay через apple_pay. ЮКасса поддерживает оба.
Трекинг заказа — самый ожидаемый экран
После оплаты пользователь хочет знать: где его еда. Экран трекинга: статус (принят → готовится → передан курьеру → в пути → доставлен) + карта с живым маркером курьера.
Координаты курьера обновляются через WebSocket (Laravel Broadcasting). На клиенте — flutter_map (OpenStreetMap/Yandex) с анимацией движения маркера через Tween. Плавная анимация маркера между координатами — через LinearAnimation по lat/lng, не прыжок.
Расчётное время доставки обновляется с бэкенда на основе реальной позиции курьера и дорожной обстановки (Yandex Routes API или Google Distance Matrix API). Не статичное «30 минут», а живой обратный отсчёт.
Push-уведомления и маркетинг
Транзакционные push: «Ваш заказ принят», «Курьер выехал», «Заказ доставлен» — FCM High Priority, без задержки.
Маркетинговые push: «Новое в меню», «Промокод на следующий заказ» — FCM Normal Priority, можно через Firebase Remote Config для A/B-тестирования сообщений.
Deep links для акционных push через Firebase Dynamic Links (или App Links / Universal Links): нажатие на push «-15% на пиццу» открывает приложение сразу на нужной категории меню.
Программа лояльности
Бонусные баллы за заказы — базовый уровень. Реализуется через таблицу транзакций баллов в PostgreSQL. Применение баллов при оплате — частичное погашение суммы. Gamification через уровни (Silver/Gold/Platinum) с разными процентами кешбэка — увеличивает частоту заказов без скидок на каждый чек.
Реферальная программа: уникальный промокод пользователя, бонус при первом заказе реферала.
Стек
Flutter 3.x + Bloc (HydratedBloc для корзины), Laravel 10 + WebSocket, PostgreSQL, FCM, Redis (кеш меню и сессий), CDN для медиа.
| Сложность | Включает | Срок |
|---|---|---|
| MVP | Меню, корзина, заказ, трекинг, оплата | 14–18 нед. |
| Средний | + программа лояльности, push-маркетинг, история заказов | 20–24 нед. |
| Полный | + мультиресторан, сплит-заказы, аналитика, A/B-тесты | 28–36 нед. |
Стоимость рассчитывается индивидуально после анализа требований.







