Добавление официально поддерживаемых Google Maps в приложение Flutter

Google недавно опубликовал официальный плагин Google Maps для Flutter, добавив во Flutter официальную поддержку Google Maps.

В этой статье мы рассмотрим, как добавить Google Maps в проект Flutter, а также о доступных функциях и настройках. На момент написания этот плагин все еще находится в предварительной версии для разработчиков и, возможно, в будущем в него будут внесены критические изменения. Я сделаю все возможное, чтобы обновить статью, когда это потребуется.

Примечание. Поскольку Google Maps использует внешний пакет, а не является встроенным, я не добавлял эту статью как часть моей серии Deep Dive в виджеты. Тем не менее, эта статья будет следовать аналогичной схеме.

Настройка нашего приложения

Прежде чем мы начнем, нам нужно настроить ключи API, чтобы наше приложение работало с Google Maps. Общие инструкции приведены здесь в пакете, следуйте им, чтобы настроить свой проект.

В двух словах:

  1. Создайте ключ API Карт Google здесь.
  2. Добавьте ключ в Android manifest.xml:
<application...
  <meta-data android:name="com.google.android.geo.API_KEY"
      android:value="YOUR API KEY"/>

3. Добавьте ключ в iOS:

Добавьте GoogleMaps импорт в Runner - ›AppDelegate.m и добавьте ключ API. Ваш файл должен выглядеть так:

#include "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
#import "GoogleMaps/GoogleMaps.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [GMSServices provideAPIKey:@"YOUR API KEY"];
  [GeneratedPluginRegistrant registerWithRegistry:self];
  // Override point for customization after application launch.
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

@end

4. Добавьте это в Info.plist.

<key>io.flutter.embedded_views_preview</key>
<string>YES</string>

И готово!

Добавление карты Google на экран

Чтобы добавить карту Google, используйте виджет GoogleMap в дереве виджетов. Вот простой пример:

Column(
  children: <Widget>[
    Container(
      height: MediaQuery.of(context).size.height,
      width: MediaQuery.of(context).size.width,
      child: GoogleMap(
        onMapCreated: (GoogleMapController controller) {},
      ),
    ),
  ],
),

Это дает нам:

Это довольно хорошо для нескольких строк кода. Но в большинстве случаев мы не хотим, чтобы в приложении была случайная карта. Итак, давайте посмотрим, как настраивать карту, управлять ею, добавлять маркеры и т. Д.

Изменение параметров карты

Параметр options позволяет нам установить некоторые настройки по умолчанию, такие как включение / отключение жестов или установка положения камеры по умолчанию и т. Д.

Смена типа карты

Мы можем установить тип карты с помощью параметра mapType в GoogleMapOptions.

Это может быть спутник, гибрид, нормальный или местность.

GoogleMap(
  onMapCreated: (GoogleMapController controller) {},
  options: GoogleMapOptions(
    mapType: MapType.satellite,
  ),
),

Установить положение камеры по умолчанию

Установка параметра cameraPosition устанавливает положение камеры по умолчанию на цель. Мы рассмотрим это подробно, когда рассмотрим CameraPosition в следующем разделе.

options: GoogleMapOptions(
  cameraPosition: CameraPosition(
    target: LatLng(37.4219999, -122.0862462),
  ),
),

Отображение местоположения пользователя

Местоположение пользователя можно отобразить на карте, установив для параметра myLocationEnabled значение true. Чтобы это работало, мы также должны добавить необходимые разрешения на обеих платформах.

На Android:

Добавлять

<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION” />

or

<uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION” />

к manifest.xml. Нам также необходимо явно запросить у пользователя разрешение.

Для этого можно использовать такой пакет, как permission_handler.

В iOS:

Добавьте ключ ‘NSLocationWhenInUseUsageDescription’ к вашему файлу ‘Info.plist’. Это автоматически запросит у пользователя разрешения, когда карта попытается включить слой Мое местоположение.

Если все пойдет хорошо, это должен быть результат.

Включение / отключение жестов

GoogleMapOptions дает нам различные варианты включения или отключения определенных типов жестов, таких как наклон, масштабирование и т. Д.

options: GoogleMapOptions(
  cameraPosition: CameraPosition(
    target: LatLng(37.4219999, -122.0862462),
  ),
  rotateGesturesEnabled: false,
  scrollGesturesEnabled: false,
  tiltGesturesEnabled: false,
)

Этот фрагмент кода отключает три упомянутых жеста.

Перемещение камеры

Если вы заметили, метод onMapCreated в GoogleMap дал нам GoogleMapController.

onMapCreated: (GoogleMapController controller) {},

Мы можем использовать этот контроллер для таких вещей, как установка маркеров или перемещение камеры.

Давайте посмотрим на пример перемещения камеры в определенное место, например, в штаб-квартиру Google.

// Declare outside build method
GoogleMapController mapController;
Scaffold(
  body: Column(
    children: <Widget>[
      Container(
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width,
        child: GoogleMap(
            onMapCreated: (GoogleMapController controller) {
              mapController = controller;
            },
      ),
    ],
  ),
  floatingActionButton: FloatingActionButton(onPressed: () {
    mapController.animateCamera(
      CameraUpdate.newCameraPosition(
        CameraPosition(
            target: LatLng(37.4219999, -122.0862462), zoom: 20.0),
      ),
    );
  }),
);

Переменная используется для хранения экземпляра GoogleMapController, что позволяет нам анимировать камеру.

Затем у нас есть FloatingActionButton и onPressed, настроенные для анимации камеры по широте и долготе штаб-квартиры Google.

Давайте посмотрим, что еще мы можем делать, перемещая камеру.

CameraUpdate. newCameraPosition ()

Этот метод позволяет нам установить широту и долготу, масштаб, азимут (ориентацию карты в градусах) и наклон (больший наклон дает вид сбоку / под наклоном на здания). Пеленг изменяет направление камеры, а не наклон.

mapController.animateCamera(
  CameraUpdate.newCameraPosition(
    CameraPosition(
      target: latLng,
      tilt: 50.0,
      bearing: 45.0,
      zoom: 20.0,
    ),
  ),
);

Это дает нам:

CameraUpdate. newLatLngBounds ()

Это устанавливает камеру между двумя LatLngs.

Например, для такого приложения, как Uber, более разумно отображать достаточно карты, чтобы покрыть вас и автомобиль, которому поручено вас подобрать, а не показывать карту всего города.

mapController.animateCamera(
    CameraUpdate.newLatLngBounds(
      LatLngBounds(
        southwest: LatLng(48.8589507, 2.2770205),
        northeast: LatLng(50.8550625, 4.3053506),
      ),
      32.0,
    ),
);

Функция берет точки юго-запад и северо-восток для покрытия на карте.

Второй параметр - это отступ, давайте посмотрим, что он делает.

Здесь юго-запад - город Париж, а северо-восток - Брюссель. Давайте установим отступ на 0,0 и попробуем.

Города почти не видны. Чтобы этого избежать, мы увеличиваем отступ для карты, чтобы на ней отображались города.

CameraUpdate.newLatLng ()

Эта функция просто устанавливает камеру на новую широту и долготу, сохраняя тот же коэффициент масштабирования.

mapController.animateCamera(
  CameraUpdate.newLatLng(
    LatLng(
      37.4219999,
      -122.0862462,
    ),
  ),
);

CameraUpdate. newLatLngZoom ()

Это похоже на последнюю функцию, но также позволяет нам изменять коэффициент масштабирования камеры.

mapController.animateCamera(
  CameraUpdate.newLatLngZoom(
    LatLng(37.4219999, -122.0862462),
    10.0, // Zoom factor
  ),
);

CameraUpdate.scrollBy ()

Просто прокручивает карту в направлении X и / или Y на определенную величину.

mapController.animateCamera(
  CameraUpdate.scrollBy(50.0, 50.0),
);

Первый параметр дает сдвиг в направлении X, тогда как второй дает сдвиг в направлении Y.

CameraUpdate. zoomIn (), CameraUpdate. zoomOut ()

Просто увеличивает или уменьшает масштаб.

mapController.animateCamera(
  CameraUpdate.zoomIn(),
);
mapController.animateCamera(
  CameraUpdate.zoomOut(),
);

CameraUpdate. zoomBy ()

Масштабирует на указанную сумму.

mapController.animateCamera(
  CameraUpdate.zoomBy(4.0),
);

CameraUpdate.zoomTo ()

Увеличение до определенного фактора.

mapController.animateCamera(
  CameraUpdate.zoomTo(5.0),
);

Добавление маркеров на карту

Мы можем использовать тот же GoogleMapController, который мы использовали ранее, чтобы добавить маркеры на карту.

Это очень просто:

mapController.addMarker(
  MarkerOptions(
    position: LatLng(37.4219999, -122.0862462),
  ),
);

Добавление текста в маркеры

Мы можем добавить информацию к маркерам с помощью параметра infoWindowText.

MarkerOptions(
    position: LatLng(37.4219999, -122.0862462),
    infoWindowText: InfoWindowText("Title", "Content"),
  ),

Изменение значка маркера

Мы можем изменить изображение, используемое для маркера, с помощью параметра icon. Давайте используем значок Flutter в качестве маркера.

В параметре icon мы можем указать такой актив:

MarkerOptions(
  position: LatLng(37.4219999, -122.0862462),
  icon: BitmapDescriptor.fromAsset('images/flutter.png',),
),

Изменение внешнего вида маркера по умолчанию

Мы также можем изменить цвет с помощью параметра значка:

MarkerOptions(
  position: LatLng(37.4219999, -122.0862462),
  icon:
      BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueBlue),
),

Мы также можем установить альфа (насколько непрозрачен значок):

MarkerOptions(
  position: LatLng(37.4219999, -122.0862462),
  alpha: 0.5,
),

И, наконец, мы можем повернуть значок:

MarkerOptions(
  position: LatLng(37.4219999, -122.0862462),
  rotation: 45.0, // Rotation in degrees
),

Вот и все! Надеюсь, вам понравилось, и оставлю пару аплодисментов, если понравилось. Подпишитесь на меня, чтобы увидеть больше статей о Flutter и комментировать любые отзывы об этой статье.

Во время написания этой статьи я наткнулся на репозиторий с довольно большим количеством примеров от Бхавик Маквана, включая карты. Смотрите здесь.

Не стесняйтесь проверять и другие мои профили и статьи:





Некоторые из моих других статей