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✔✔● Limited
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.

Feature state on iOS

Feature state works on Android and web. On iOS the calls throw an UnsupportedError, because the MapLibre iOS SDK does not expose the API yet.

Projection, terrain and sky on Android and iOS

setProjection(), setTerrain(), setSky() and setGlobalStateProperty() 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.

Image sources on web

A style-spec image source, added with addSource() and ImageSourceProperties, works on every platform. The byte-based calls, addImageSource() and updateImageSource(), are Android and iOS only: on web they throw UnimplementedError.

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: the Android SDK exposes only a linear-or-not easing flag, so easeInOut, easeOut and fastOutLinearIn all render as the native ease-in/ease-out curve. iOS and web implement all four curves.