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.