Skip to content

Why MapLibre GL

There are three mainstream ways to put a map in a Flutter app. This page is an honest comparison, not a sales pitch, to help you pick the right one. If another library fits your project better, you should use it.

Capability flutter-maplibre-gl flutter_map google_maps_flutter
Renderer MapLibre Native (C++/GPU) Flutter canvas Google Maps SDK
Offline maps Android & iOS No No
Custom vector styles Full spec Limited No
GeoJSON support Full + live update Via plugins Limited
Data-driven styling Expressions No No
Clustering Native Via plugin No
Heatmaps Yes No No
3D extrusion Yes No Limited
PMTiles Built-in Via plugin No
Vector tiles Yes Yes No
Open tile sources Yes Yes Key required
Web support GL JS Yes Yes
License BSD-2 BSD-2 Proprietary
Tile cost Free options Free options Free options

full support  ·  partial / via plugin  ·  not available

Choose flutter-maplibre-gl when

You need any of these, and they are hard or impossible elsewhere:

  • Offline maps. Users download regions and keep using the map with no connection.
  • Custom styling. White-label maps, dark mode, brand colors, show or hide individual layers.
  • Large datasets. Tens of thousands of GeoJSON features rendered on the GPU without dropping frames.
  • Data-driven styling. Color roads by speed limit, size circles by population, all evaluated per feature at render time.
  • PMTiles. Self-host your tile data as a single file with no tile server.
  • An open stack. No vendor lock-in and no API key when you use open tile providers.
  • Advanced cartography. 3D buildings, hillshade, heatmaps, terrain.

Choose flutter_map when

flutter_map is the right call when:

  • You want pure Flutter rendering with no native code, including smooth desktop support without platform-view overhead.
  • You need to overlay arbitrary Flutter widgets directly inside the tile layer.
  • Your map is simple: raster tiles plus a handful of markers.
  • You target Linux or Windows desktop, where native MapLibre support is limited.
  • Your team wants to avoid native iOS and Android setup.

flutter_map renders raster tiles (PNG/WebP) by default. It does not do vector styles, expressions, or GPU-accelerated vector rendering natively.

Choose google_maps_flutter when

google_maps_flutter fits when:

  • Users expect the Google Maps look and brand.
  • You already run a Google Maps Platform billing account and key.
  • You need Google-specific features: Street View, Places integration, Google traffic.
  • Your organization mandates Google services.

The mobile Maps SDK (Android/iOS) is free with no map-load billing, though it still requires an API key and a billing account on file, and usage-based services (Places, Directions, the Maps JavaScript SDK for web) are billed beyond a monthly free credit. Google Maps also has no offline support, and the style cannot be customized beyond basic color tweaks.

Performance at scale

Rendering 10,000 point features is where the architectural difference shows:

Aspect flutter-maplibre-gl flutter_map google_maps_flutter
Approach Vector tiles + GPU Raster tiles + canvas Raster tiles + SDK
10k points Native cluster/layer Plugin, may lag Not designed for it
Smooth at 60fps Yes Depends on count Depends
Data-driven colors Expressions No No

All rendering is delegated to the native MapLibre engine, which runs on the GPU. The Flutter layer only manages configuration. It never draws map tiles itself.

For the full platform-by-platform breakdown, see the Feature Matrix.