1. Введение в Yandex Mapkit и базовая настройка проекта
Архитектура и базовые принципы работы Yandex Mapkit во Flutter
Интеграция интерактивных карт — одна из самых частых задач при разработке мобильных приложений для логистики, доставки, такси и электронной коммерции. Yandex Mapkit представляет собой мощный SDK (набор средств разработки), который позволяет встраивать картографические данные Яндекса в мобильные приложения.
В отличие от простых статических изображений, Mapkit предоставляет полноценный движок для рендеринга векторных карт, построения маршрутов, поиска организаций и работы с геозонами. Во Flutter эта библиотека не отрисовывается средствами самого фреймворка (через Skia или Impeller), а использует механизм Platform Views. Это означает, что Flutter создает «окно», в котором отображается нативный компонент карты для Android (на базе Java/Kotlin) или iOS (на базе Objective-C/Swift).
Для понимания целесообразности использования Yandex Mapkit, рассмотрим сравнение с другими популярными решениями.
| Характеристика | Yandex Mapkit | Google Maps | Mapbox | | :--- | :--- | :--- | :--- | | Детализация в СНГ | Максимальная (включая дворовые проезды) | Средняя | Базовая | | Оффлайн-карты | Поддерживаются | Ограниченно | Поддерживаются | | Стоимость (базовая) | Бесплатно до лимитов (затем от 12000 руб./мес) | Платный API (есть бесплатный порог 200 USD) | Платный API (по количеству загрузок) | | Рендеринг во Flutter | Platform Views | Platform Views | Platform Views / GL |
Получение API-ключа и безопасность
Любое взаимодействие с серверами Яндекса требует авторизации. Для этого используется уникальный идентификатор — API-ключ. Без него карта либо не загрузится, либо будет отображать пустую сетку без тайлов (фрагментов карты).
Процесс получения ключа состоит из следующих шагов:
> Никогда не храните API-ключи в открытом виде в публичных репозиториях (например, на GitHub). Злоумышленники могут использовать ваш ключ, что приведет к исчерпанию бесплатных лимитов и непредвиденным финансовым расходам.
Математика картографических тайлов
Перед тем как переходить к коду, важно понять, как карта загружается в память устройства. Карта мира не загружается целиком. Она разбита на квадратные изображения — тайлы (обычно размером 256x256 пикселей). Количество тайлов зависит от уровня масштабирования (zoom level).
Количество тайлов по одной оси рассчитывается по формуле:
Где — количество тайлов по горизонтали или вертикали, а — текущий уровень масштаба (zoom).
Например, при масштабе (вид на всю планету), . Вся Земля помещается в 1 тайл. При масштабе (уровень города), тайла по одной оси. Общее количество тайлов для покрытия всей планеты на этом масштабе составит тайлов. Именно поэтому Mapkit загружает только те тайлы, которые попадают в видимую область экрана пользователя, экономя трафик и оперативную память.
Настройка нативных платформ
Поскольку Yandex Mapkit использует нативные SDK, добавления пакета yandex_mapkit в файл pubspec.yaml недостаточно. Необходимо инициализировать библиотеку на стороне Android и iOS до того, как запустится движок Flutter.
Конфигурация для Android
В проекте Flutter перейдите в директорию android/app/src/main/kotlin/.../ и найдите файл MainActivity.kt (или создайте MainApplication.kt, если используете кастомный класс приложения). Инициализация ключа должна происходить в методе onCreate.
Также в файле android/app/build.gradle необходимо убедиться, что параметр minSdkVersion установлен как минимум на 21, так как современные версии Mapkit не поддерживают более старые версии Android.
Конфигурация для iOS
Для устройств Apple настройка производится в файле ios/Runner/AppDelegate.swift. Здесь также нужно передать API-ключ до регистрации плагинов Flutter.
Кроме того, если ваше приложение будет запрашивать геопозицию пользователя для отображения его на карте, в файл ios/Runner/Info.plist необходимо добавить ключи NSLocationWhenInUseUsageDescription и NSLocationAlwaysUsageDescription с текстовым объяснением, зачем приложению нужны эти данные.
Интеграция виджета YandexMap во Flutter
После успешной настройки нативных проектов можно переходить к Dart-коду. Основным визуальным компонентом является виджет YandexMap. Он предоставляет холст, на котором рендерится карта, и принимает различные коллбэки для обработки событий.
Рассмотрим базовый пример экрана с картой:
В этом примере ключевым элементом является функция onMapCreated. Она срабатывает один раз, когда нативный компонент карты успешно инициализирован и встроен в иерархию виджетов Flutter. В этот момент мы получаем экземпляр YandexMapController.
Контроллер — это главный инструмент управления картой. Через него мы будем программно менять масштаб, перемещать камеру к нужным координатам, добавлять маркеры (Placemarks) и рисовать маршруты. Без сохранения ссылки на этот контроллер мы сможем только наблюдать статичную карту, но не сможем ей управлять из кода.
Например, если мы хотим переместить камеру в центр Москвы сразу после загрузки, мы используем метод moveCamera у сохраненного контроллера, передав ему объект CameraPosition с нужными координатами широты и долготы.