Skip to content

Feature Matrix

What works on each platform. flutter-maplibre-gl uses MapLibre Native on Android and iOS, and MapLibre GL JS on the web. Desktop (Windows, macOS, Linux) is not a supported target for this package.

✔ supported  ·  ● partial, see the note  ·  ✘ not available on this platform

Core

FeatureAndroidiOSWeb
Map widget✔✔✔
Map controller✔✔✔
Camera control & animation✔✔✔
Gesture handling✔✔✔
Tap / long-press events✔✔✔
User location✔✔✔
Manual location source✔✔✔
Offline regions✔✔✘
Offline database export & import✔✔✘
Snapshot (static image)✔✔✔
Pause / resume rendering✔✔● No-op
Content insets / padding✔✔✔
Tracking camera options✔✔✘

Annotations

FeatureAndroidiOSWeb
Symbol (markers)✔✔✔
Circle✔✔✔
Line✔✔✔
Fill (polygon)✔✔✔
Custom marker images✔✔✔
Draggable annotations✔✔✔

Style Layers

FeatureAndroidiOSWeb
Symbol layer✔✔✔
Circle layer✔✔✔
Line layer✔✔✔
Fill layer✔✔✔
Fill extrusion (3D)✔✔✔
Heatmap layer✔✔✔
Hillshade layer✔✔✔
Raster layer✔✔✔
Color relief layer✔✔✔
Background layer✔✔✔
Data-driven expressions✔✔✔
Feature state✔✔✔
Clustering✔✔✔
Cluster inspection✔✔✔

Style Root Objects

FeatureAndroidiOSWeb
Globe & vertical-perspective projection✘✘✔
Terrain (raster DEM elevation)✘✘✔
Sky & atmosphere✘✘✔
Light (3D shading)● Constants● Constants✔
Global state✔✔✔

Sources

Source typeAndroidiOSWeb
GeoJSON✔✔✔
Vector tiles✔✔✔
Raster tiles✔✔✔
Raster DEM✔✔✔
Image source✔✔✔
Video source✘✘✔
PMTiles✔✔✔

Pointer events on web

Hover events exist only on the web build (MapLibre GL JS); on Android and iOS use tap and long-press instead, and guard hover-only logic with kIsWeb. The browser has no long-press gesture, so on web onMapLongClick fires on a double-click.

Projection, terrain and sky on Android and iOS

setProjection(), setTerrain() and setSky() throw an UnsupportedError on Android and iOS: MapLibre Native implements none of them yet, so the map stays a flat mercator projection there. See Globe, Terrain and Sky.

Light on Android and iOS

setLight() works on all three platforms, but MapLibre Native takes constant values only. An expression for anchor, position, color or intensity is rejected with INVALID_ARGUMENT on Android and iOS; web accepts it.

Tracking camera options on web

setTrackingCameraOptions() throws an UnsupportedError on web. MapLibre GL JS has no location component, and its GeolocateControl drops its follow lock on any programmatic camera change. See User Location.

Video sources

VideoSourceProperties works on web only. MapLibre Native has no video source, so on Android and iOS addSource() throws UNSUPPORTED_SOURCE_TYPE.

Pause and resume on web

pauseMap() and resumeMap() are no-ops on web rather than errors, so no kIsWeb guard is needed around them. See Startup & Performance.

Camera animation easing

easeCamera's CameraAnimationInterpolation is partial on Android and iOS. The Android SDK exposes only a linear-or-not easing flag, so easeInOut, easeOut and fastOutLinearIn all ease out along MapLibre Native's own curve. The iOS SDK can only ease along curves starting with the control point (0, 0): easeOut is exact, fastOutLinearIn within 1%, and easeInOut eases out as on Android. Web implements all four curves.