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.