Map Launcher

pub package

Map Launcher is a flutter plugin to find available maps installed on a device and launch them with a marker or show directions.

MarkerNavigation
MarkerNavigation

Currently supported maps:
Google Maps
Apple Maps (iOS only)
Baidu Maps
Amap (Gaode Maps)
Waze
Yandex Maps
Yandex Navigator
Citymapper
Maps.me
OsmAnd
2GIS

Get started

Add dependency

dependencies:
  map_launcher: ^0.12.2

For iOS add url schemes in Info.plist file

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>comgooglemaps</string>
    <string>baidumap</string>
    <string>iosamap</string>
    <string>waze</string>
    <string>yandexmaps</string>
    <string>yandexnavi</string>
    <string>citymapper</string>
    <string>mapsme</string>
    <string>osmandmaps</string>
    <string>dgis</string>
</array>

Usage

Get list of installed maps and launch first

import 'package:map_launcher/map_launcher.dart';

final availableMaps = await MapLauncher.installedMaps;
print(availableMaps); // [AvailableMap { mapName: Google Maps, mapType: google }, ...]

await availableMaps.first.showMarker(
  coords: Coords(37.759392, -122.5107336),
  title: "Ocean Beach",
);

Check if map is installed and launch it

import 'package:map_launcher/map_launcher.dart';

if (await MapLauncher.isMapAvailable(MapType.google)) {
  await MapLauncher.showMarker(
    mapType: MapType.google,
    coords: coords,
    title: title,
    description: description,
  );
}

API

Show Marker

optiontyperequireddefault
mapTypeMapTypeyes-
coordsCoords(lat, long)yes-
titleStringno''
descriptionStringno''
zoomIntno16
Maps
mapTypecoordstitledescriptionzoom
.googleiOS only
see Known Issues section below
.apple
.amapAndroid only
.baidu
.waze
.yandexMaps
.yandexNavi
.citymapper
does not support marker
shows directions instead
.mapswithme
.osmandiOS onlyAndroid only
.doubleGis
android does not support marker
shows directions instead

Show Directions

optiontyperequireddefault
mapTypeMapTypeyes-
destinationCoords(lat, long)yes-
destinationTitleStringno'Destination'
originCoords(lat, long)noCurrent Location
originTitleStringno'Origin'
directionsModeDirectionsModeno.driving
waypointsList<Coords(lat, long)>nonull
Maps
mapTypedestinationdestinationTitleoriginoriginTitledirectionsModewaypoints
.google
.apple
.amap
.baidu
.wazealways uses current location
.yandexMaps
.yandexNavi
.citymapper
.mapswithmeonly shows marker
.osmandiOS onlyalways uses current location
.doubleGis

Example

Using with bottom sheet

import 'package:flutter/material.dart';
import 'package:map_launcher/map_launcher.dart';

void main() => runApp(MapLauncherDemo());

class MapLauncherDemo extends StatelessWidget {
  openMapsSheet(context) async {
    try {
      final coords = Coords(37.759392, -122.5107336);
      final title = "Ocean Beach";
      final availableMaps = await MapLauncher.installedMaps;

      showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return SafeArea(
            child: SingleChildScrollView(
              child: Container(
                child: Wrap(
                  children: <Widget>[
                    for (var map in availableMaps)
                      ListTile(
                        onTap: () => map.showMarker(
                          coords: coords,
                          title: title,
                        ),
                        title: Text(map.mapName),
                        leading: Image(
                          image: map.icon,
                          height: 30.0,
                          width: 30.0,
                        ),
                      ),
                  ],
                ),
              ),
            ),
          );
        },
      );
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Map Launcher Demo'),
        ),
        body: Center(child: Builder(
          builder: (context) {
            return MaterialButton(
              onPressed: () => openMapsSheet(context),
              child: Text('Show Maps'),
            );
          },
        )),
      ),
    );
  }
}

Known issues

  • Google Maps for Android have a bug that setting label for a marker doesn't work. See more on Google Issue Tracker

Contributing

Pull requests are welcome.

Libraries

map_launcher