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
| Feature | Android | iOS | Web |
|---|---|---|---|
| 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
| Feature | Android | iOS | Web |
|---|---|---|---|
| Symbol (markers) | ✔ | ✔ | ✔ |
| Circle | ✔ | ✔ | ✔ |
| Line | ✔ | ✔ | ✔ |
| Fill (polygon) | ✔ | ✔ | ✔ |
| Custom marker images | ✔ | ✔ | ✔ |
| Draggable annotations | ✔ | ✔ | ✔ |
Style Layers
| Feature | Android | iOS | Web |
|---|---|---|---|
| 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
| Feature | Android | iOS | Web |
|---|---|---|---|
| Globe & vertical-perspective projection | ✘ | ✘ | ✔ |
| Terrain (raster DEM elevation) | ✘ | ✘ | ✔ |
| Sky & atmosphere | ✘ | ✘ | ✔ |
| Light (3D shading) | ● Constants | ● Constants | ✔ |
| Global state | ✘ | ✘ | ✔ |
Sources
| Source type | Android | iOS | Web |
|---|---|---|---|
| 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.