Ответ
Одна из фич, которой я горжусь, — это офлайн-карта с маршрутизацией в приложении для туристов на 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 и оптимизацию тяжелых вычислений в мобильном приложении.