Flutter plugin for launching maps
Find a file
amirhossein noorollahzadegan f882c7cb1c remove neshan and balad
2025-01-04 19:53:30 +03:00
.github/workflows feat: auto publish action 2024-06-05 12:13:34 +02:00
.vscode chore: remove support for apps using android v1 embedding (#186) 2024-08-14 00:20:03 +02:00
android remove neshan and balad 2025-01-04 19:53:30 +03:00
assets/icons add neshan and balad map types 2024-11-26 15:54:46 +03:30
example remove neshan and balad 2025-01-04 19:53:30 +03:00
ios remove neshan and balad 2025-01-04 19:53:30 +03:00
lib remove neshan and balad 2025-01-04 19:53:30 +03:00
screenshots chore: update screenshots 2023-02-14 15:01:19 +01:00
.fvmrc chore: remove support for apps using android v1 embedding (#186) 2024-08-14 00:20:03 +02:00
.gitignore chore: remove support for apps using android v1 embedding (#186) 2024-08-14 00:20:03 +02:00
.metadata 0.1.0 2019-10-24 17:48:03 +08:00
analysis_options.yaml Introduce static analysis (#172) 2024-03-07 11:03:24 +01:00
CHANGELOG.md chore: rename mmi to mappls, update readme and changelog 2024-08-25 09:36:21 +02:00
LICENSE Update LICENSE 2020-02-22 23:38:27 +08:00
map_launcher.iml added method to check if map is available 2019-11-06 21:42:20 +08:00
pubspec.lock remove neshan and balad 2025-01-04 19:53:30 +03:00
pubspec.yaml chore: rename mmi to mappls, update readme and changelog 2024-08-25 09:36:21 +02:00
README.md chore: rename mmi to mappls, update readme and changelog 2024-08-25 09:36:21 +02:00

Map Launcher

pub package likes popularity pub points GitHub stars GitHub forks

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

Marker Navigation
Marker Navigation

Currently supported maps:
Google Maps
Apple Maps (iOS only)
Google Maps GO (Android only)
Baidu Maps
Amap (Gaode Maps)
Waze
Yandex Maps
Yandex Navigator
Citymapper
Maps.me (iOS only)
OsmAnd
OsmAnd+ (Android only)
2GIS
Tencent (QQ Maps)
HERE WeGo
Petal Maps (Android only)
TomTom Go
TomTom Go Fleet
CoPilot
Flitsmeister (Android only)
Truckmeister (Android only)
Sygic Truck
Naver Map
KakaoMap
TMAP
Mapy.cz
Mappls MapmyIndia

Get started

Add dependency

dependencies:
  map_launcher: ^3.5.0
  flutter_svg: # only if you want to use icons as they are svgs

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>mapswithme</string>
    <string>osmandmaps</string>
    <string>dgis</string>
    <string>qqmap</string>
    <string>here-location</string>
    <string>tomtomgo</string>
    <string>copilot</string>
    <string>com.sygic.aura</string>
    <string>nmap</string>
    <string>kakaomap</string>
    <string>tmap</string>
    <string>szn-mapy</string>
    <string>mappls</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

option type required default
mapType MapType yes -
coords Coords(lat, long) yes -
title String no ''
description String no ''
zoom Int no 16
extraParams Map<String, String> no {}
Maps
mapType coords title description zoom extraParams
.google iOS only
see Known Issues section below
.apple
.googleGo
.amap Android only
.baidu
.waze
.yandexMaps
.yandexNavi
.citymapper
does not support marker
shows directions instead
.mapswithme
.osmand iOS only
.osmandplus iOS only
.doubleGis
android does not support marker
shows directions instead
.tencent
.here
.petalMaps
.tomtomgo
iOS does not support marker
shows directions instead
.copilot
.flitsmeister
does not support marker
shows directions instead
.truckmeister
does not support marker
shows directions instead
.sygicTruck
does not support marker
shows directions instead
.mappls

Show Directions

option type required default
mapType MapType yes -
destination Coords(lat, long) yes -
destinationTitle String no 'Destination'
origin Coords(lat, long) no Current Location
originTitle String no 'Origin'
directionsMode DirectionsMode no .driving
waypoints List<Waypoint(lat, long, String?)> no null
extraParams Map<String, String> no {}
Maps
mapType destination destinationTitle origin originTitle directionsMode waypoints extraParams
.google ✓ (up to 8 on iOS and unlimited? on android)
.apple
.googleGo
.amap
.baidu
.waze always uses current location
.yandexMaps
.yandexNavi
.citymapper
.mapswithme only shows marker
.osmand iOS only always uses current location
.osmandplus iOS only always uses current location
.doubleGis
.tencent
.here
.petalMaps
.tomtomgo always uses current location
.copilot always uses current location
.flitsmeister always uses current location
.truckmeister always uses current location
.sygicTruck always uses current location
.mappls

Extra Params

It's possible to pass some map specific query params like api keys etc using extraParams option

Here are known params for some maps:

mapType extraParams
.tencent { 'referer': '' }
.yandexNavi { 'client': '', 'signature': '' }

Example

Using with bottom sheet

import 'package:flutter/material.dart';
import 'package:map_launcher/map_launcher.dart';
import 'package:flutter_svg/flutter_svg.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: SvgPicture.asset(
                          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

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

  • On iOS it's possible to "delete" Apple Maps which actually just removes it from homescreen and does not actually delete it. Because of that Apple Maps will always show up as available on iOS. You can read more about it here

Contributing

Pull requests are welcome.