Ответ
Одна из фич, которой я горжусь, — это офлайн-карта с маршрутизацией в приложении для туристов на Flutter. Пользователи могли загружать региональные карты и строить пешеходные маршруты без подключения к интернету.
Техническая реализация:
- Выбор стека: Для работы с векторными картами я использовал пакет
flutter_mapвместе сvector_tiles. Данные карт (в формате.mbtiles) хранились локально в приложении после загрузки. - Офлайн-маршрутизация: Самая сложная часть. Я интегрировал движок маршрутизации Valhalla, скомпилированный в нативную библиотеку (с помощью FFI —
dart:ffi). Для Android и iOS пришлось писать отдельные плагины, которые загружали граф дорог (также предзагружаемый) и вычисляли маршрут.// Упрощённый пример вызова нативного кода через FFI final route = await OfflineRouter.instance.calculateRoute( start: LatLng(55.7558, 37.6173), end: LatLng(55.7601, 37.6245), profile: RoutingProfile.walking, ); - Отображение маршрута: Рассчитанный маршрут (список координат) отрисовывался поверх карты с помощью
CustomPainter, что давало полный контроль над стилем линии (цвет, ширина, пунктир). - Управление данными: Реализовал систему фоновой загрузки и обновления карт с индикацией прогресса и проверкой целостности файлов.
Чем я горжусь:
- Архитектура: Фича была полностью изолирована в отдельный feature-модуль по принципу Feature-First. Использовался
riverpodдля состояния, что упростило тестирование. - Производительность: Маршрут длиной 10 км рассчитывался за 1-2 секунды на среднем смартфоне, без лагов при отрисовке.
- Пользовательский результат: Фича стала ключевой для приложения, так как туристы часто оказывались вне зоны покрытия. По данным аналитики, пользователи с загруженными картами проводили в приложении на 40% больше времени.
Этот опыт глубоко погрузил меня в нативные интеграции, работу с памятью в Dart FFI и оптимизацию тяжелых вычислений в мобильном приложении.
Ответ 18+ 🔞
Да ты послушай, какая история приключилась! Ебать мои старые костыли, я тут в одном приложении для туристов на Flutter такую штуку впилил, что до сих пор сам от себя охуеваю. Представь: офлайн-карта с маршрутизацией. То есть чел в горах, где связи ноль ебать, открывает приложение — а ему тропинку от точки А до точки Б строит. Вообще ништяк.
Как это всё под капотом устроено, ёпта:
- Карты: Взял
flutter_mapсvector_tiles. Карты регионов качаются в приложение одним файликом.mbtilesи лежат себе спокойно в памяти телефона. Без этих плясок с онлайн-тайлами. - Самое мясо — маршрутизация: Вот тут была жесть, чувак. Нужен был движок, который граф дорог жуёт. Выбрал Valhalla. И его, блядь, пришлось в натив загнать! Сделал отдельные библиотеки под Android и iOS, а из Flutter через
dart:ffiк ним обращаюсь. Граф дорог тоже предзагружаемый, весит, конечно, овердохуища, но что поделать.// Ну тут вроде всё понятно, дергаем нативку final route = await OfflineRouter.instance.calculateRoute( start: LatLng(55.7558, 37.6173), end: LatLng(55.7601, 37.6245), profile: RoutingProfile.walking, ); - Рисовка: Получил список точек — отрисовал линию поверх карты через
CustomPainter. Хочешь синюю, хочешь пунктирную, хочешь с анимацией — полная власть. - Загрузка: Сделал систему, чтобы карты в фоне качались, с прогресс-баром и проверкой, что файл не битый. А то скачает пользователь три гига, а там хуй с винтом.
Чем особенно доволен, бля:
- Чистота: Всю эту банду — карты, маршрутизатор, логику — запихнул в отдельный feature-модуль. Состояние на
riverpod. Тестировать — одно удовольствие, ничего нигде не ползает. - Скорость: На среднестатистическом телефоне маршрут на 10 километров считает за секунду-две. Никаких тормозов, всё летает.
- Польза: Это ж, бля, главное! Туристы в лесах и горах без сети как сыр в масле катаются. Аналитика показала, что те, кто карты качал, в приложении на 40% дольше торчали. Вот она, победа.
В общем, эта фича меня конкретно прокачала: и в нативные интеграции нырнул с головой, и с памятью через FFI разобрался, и научился тяжелые вычисления на мобилке оптимизировать, чтобы не жрала батарею как не в себя. Ёперный театр, хорошая задача была.