> For the complete documentation index, see [llms.txt](https://docs.mapsindoors.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.mapsindoors.com/other/changelog/flutter-plugin.md).

# Flutter SDK

Change log for the MapsIndoors Flutter SDK. This document structure is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and the project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## \[4.8.0] 2026-10-02

### Changed

* The minimum iOS version is now 16.0, and building for iOS requires Xcode 26. Set `platform :ios, '16.0'` in your `Podfile` and raise your app's iOS deployment target to match.
* Updated Mapsindoors SDKs:
  * Android to [4.22.0](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.22.0-2026-09-17)
  * iOS to [4.21.0](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.21.0-2026-09-21)
* On iOS, the MapsIndoors SDK now depends on Google Maps SDK 10.15.0 and Mapbox Maps SDK 11.25.0.
* On iOS, `setAnimatedPolyline` no longer has any effect. It ignored `animated` and `repeating` there, and read `durationMs` as seconds. Use `setOptions` instead, which works on both platforms.
* MapsIndoors Insights now attributes sessions from iOS apps to this plugin and its version, as it already did on Android.

### Added

* `MPDirectionsRenderer.setOptions`, `getOptions` and `clearOptions`, with `MPDirectionsRendererOptions`, `MPStrokeStyle` and `MPRouteAnimationType`, to change the style and animation of the rendered route at runtime. Properties left unset keep the wayfinding style configured in the MapsIndoors CMS. On Google Maps for iOS, `MPStrokeStyle.dashed` is drawn solid.
* Offline caching of Mapbox base-map tiles, so the map underneath MapsIndoors still renders without a network: `enableBaseMapCaching`, `synchronizeBaseMapTiles` and `isBaseMapCachingSupported`, with `MPMapboxStyleSource`, `MPDataSetCachingScope` and `OnBaseMapCacheProgressListener`. The Google Maps packages report caching as unsupported.
* `MPDirectionsRenderer.finishGuidance`, which reports to MapsIndoors Insights that the user finished following a route.
* `setMapsIndoorsLanguage` supports Simplified and Traditional Chinese (`zh-Hans`, `zh-Hant`) on solutions that provide them, and resolves `zh-CN` and `zh-TW` to them.

### Fixed

* On iOS, the app no longer crashes when `getMapStyles` or `MapsIndoorsWidget.setHighlight` is called, or a display rule is changed, while a map is shown.
* On iOS, `selectVenue`, `selectBuilding`, `selectLocation`, `selectLocationById` and `setHighlight` on `MapsIndoorsWidget` now complete once the change has been applied, as on Android, so it can be read back as soon as they return. They used to complete before it had started.
* On iOS, the leg-selected listener now runs before `nextLeg`, `previousLeg` and `selectLegIndex` complete, as on Android, instead of shortly afterwards.
* On Android, the first MapsIndoors Insights session after an app start was attributed to the Android SDK rather than to this plugin.
* The colour getters on `MPDisplayRule` (`getPolygonFillColor`, `getPolygonStrokeColor`, `getExtrusionColor`, `getWallColor`, `getBadgeFillColor`, `getBadgeStrokeColor`, `getLabelStyleHaloColor` and `getLabelStyleTextColor`) no longer return a fully transparent colour. Both platforms send these as six-digit `#RRGGBB` strings, which were decoded with an alpha of 0; they are now opaque. An app that compensated with `withAlpha(255)` or `withOpacity(1.0)` can drop that, but does not have to.
* `MPGeometry.contains`, `MPVenue.contains` and `MPBuilding.contains`, and `area` on `MPPolygon` and `MPMultiPolygon`, now return results. On Android they always failed, and on iOS `contains` always failed and `area` returned null. A point inside a polygon's hole counts as outside on both platforms. Android's `area` can read up to about 1% higher than iOS's, because the two SDKs calculate it differently.
* `getSquaredDistanceToClosestEdge` on `MPPolygon` and `MPMultiPolygon` now returns a distance on both platforms, where it always failed before. It returns -1 when the point is outside the geometry's bounding box.
* On Android, a method call the native side does not implement, which can happen when the plugin's packages resolve to different versions, now fails with a `MissingPluginException` instead of never completing.

### Deprecated

* `MPDirectionsRenderer.setPolyLineColors` and `setAnimatedPolyline`. Use `setOptions` instead.

## \[4.7.1] 2026-06-02

### Fixed

* Fixed issue on Android where floorselector actions returned from the SDK would not always run on the main thread, resulting in a crash

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.18.3](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.18.3)

## \[4.7.0] 2026-05-18

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.18.2](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.18.2)
  * iOS to [4.17.0](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.17.0)

## \[4.6.3] 2026-03-11

### Fixed

* The function `addVenuesToSync` no longer causes a crash on iOS
* The function `getLocationsByQuery` no longer uses excessive amounts of memory on Android

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.16.2](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.16.2)
  * iOS to [4.16.1](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.16.1)

## \[4.6.2] 2026-01-30

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.16.1](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.16.1-2026-01-27)
  * iOS to [4.16.0](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.16.0-2026-01-29)

## \[4.6.1] 2025-11-27

### Fixed

* Added proguard consumer rules that should help avoid issues when minifying the SDK
* Fixed issues with parsing Additional Details on iOS devices

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.16.0](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.16.0-2025-11-21)
  * iOS to [4.15.6](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.15.6-2025-11-18)

## \[4.6.0] 2025-10-17

### Added

* Added support for [Additional Details](https://docs.mapsindoors.com/products/cms/additional-location-details)
* Added support for [Nested Categories](https://docs.mapsindoors.com/products/cms/categories#subcategories)

### Fixed

* Fixed a number of build issues on both Android and iOS

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.15.5](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.15.5-2025-10-15)
  * iOS to [4.15.2](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4)

## \[4.5.1] 2025-09-23

### Fixed

* Inconsistencies in color values across Android and iOS are gone
* Avoid crashes when accessing a number of properties due to null values
* The callback for `onLegSelected` in the `onLegSelectedListener` is now called on iOS

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.15.2](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.15.2-2025-09-22), making Android 16 kB page size compatible (Google Play requirement from November 1)
  * iOS to [4.14.0](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.14.0-2025-09-16)

## \[4.5.0] 2025-08-28

### Added

* Added support for `automatedZoomLevel` property in `MPSolutionConfig` to limit the zoom level when using e.g. the `goTo(entity:)` method
* Added `goTo(entity:maxZoom:)` method to allow for limiting the zoom level manually instead of using `automatedZoomLevel`

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.14.1](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.14.1-2025-08-28)
  * iOS to [4.13.2](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.13.2-2025-08-06)

## \[4.4.1] 2025-08-05

### Fixed

* Fixed issues with using `zoomTo` and `zoomBy` camera updates on iOS.
* Fixed issue with `fromBounds` camera update not adjusting the zoom level correctly.
* Fixed issue with set `hiddenFeatures` not being respected on iOS.

### Changed

* Updated MapsIndoors SDKs:
  * iOS to [4.13.0](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.13.0-2025-08-01)

## \[4.4.0] 2025-07-29

### Fixed

* Fixed a number of Typos
* Fixed an issue where attempting to fetch display rules by name using location ids not working on iOS
* Fixed an issue where setting a duration on a `CameraUpdate` would be ignored on iOS
* Fixed an issue where setting a zoom value on a `CameraUpdate` would sometimes be ignored on iOS
* Fixed a native crash on Android by updating the underlying Mapbox Maps version

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.13.0](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.13.0-2025-07-29)

## \[4.3.2] 2025-07-24

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.12.5](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.12.5-2025-07-24)

## \[4.3.1] 2025-07-23

### Fixed

* Fixed a build issue on iOS

## \[4.3.0] 2025-07-22

### Added

* Added `enableMapsIndoorsDebugLogging(bool)` function to enable SDK logging to help with debugging.

### Changed

* Updated MapsIndoors SDKs:
  * iOS to 4.12.3

## \[4.2.5] 2025-07-15

### Fixed

* Resolved cocoapods dependency issue

## \[4.2.4] 2025-07-11

### Added

* Added possibility to define which map features to show when initializing the MapsIndoors widget

### Fixed

* `zoomBy` on iOS now actually zooms by the given amount from the current zoom level
* `zoom` level reported by Android when using Mapbox to not be off by 1

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.12.4](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.12.4-2025-07-11)
  * iOS to [4.12.2](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.12.2-2025-07-09)

## \[4.2.3] 2025-06-24

### Fixed

* Fixed iOS compilation error

## \[4.2.2] 2025-06-20

### Fixed

* Fixed iOS not respecting `setHiddenFeatures` for 3D models

### Changed

* Updated MapsIndoors SDKs:
  * Android to [4.12.3](https://docs.mapsindoors.com/other/changelog/android-sdk/v4#id-4.12.3-2025-06-19)
  * iOS to [4.12.1](https://docs.mapsindoors.com/other/changelog/ios-sdk/v4#id-4.12.1-2025-06-19)

## \[4.2.1] 2025-06-05

### Fixed

* Fixed Android not respecting `setHiddenFeatures` for 3D models

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.12.1

## \[4.2.0] 2025-05-14

### Added

* LabelPositioning on DisplayRules
* Elevated 2D Models (Mapbox)
  * 2D Models that are placed on Extrusions will now be raised to be placed on top
* Clip Layer (Mapbox)
  * Extruded buildings and Trees from the MapBox standard style can now be removed, when inside venue's geometry.
  * Does not remove landmarks consistently, will be solved with a future version of Mapbox
  * Requires the module to be enabled; contact MapsPeople to enable it.

### Fixed

* Added additional guards against the map being used before it is ready (Android/Google Maps)
* Fixed issue causing compass to persist even when disabled (Android)
* getLocationsByExternalIds now can return more than a single Location in the list (as would be expected) (iOS)
* Fixed issue where some routes would be incorrect if the route was calculated while offline
* Fixed issue where moving beyond the venue could cause a crash due to the floor selector
* Reenabled Mapbox Attribution as it no longer causes a crash when tapped (Android/Mapbox)

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.12.0
  * iOS to 4.11.0

## \[4.1.6] 2025-03-26

### Fixed

* Made `getLocations()` return the same result on both Android and iOS.

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.11.3
  * iOS to 4.9.6

## \[4.1.5] 2025-03-13

### Fixed

* `zoomLevelChanged` callback for custom floor selectors now gets called on iOS as well.

## \[4.1.4] 2025-03-06

### Fixed

* Removed a number of potential memory retentions in the iOS part of the Flutter plugin.
* Restored functionality of the listeners on iOS that were disabled in version 4.1.3.

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.11.2
  * iOS to 4.9.5

## \[4.1.3] 2025-02-20

### Changed

* Updated MapsIndoors SDKs:
  * iOS to 4.9.4 (to address some memory issues)

## \[4.1.2] 2025-01-30

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.10.1
  * iOS to 4.9.2

## \[4.1.1] 2025-01-09

### Fixed

* Fixed Android build issue

## \[4.1.0] 2025-01-09

### Added

* Added the ability to set a custom Mapbox style using the new `mapStyleUri` on `MapsIndoorsWidget`

### Fixed

* Fixed issue where setting `mapsIndoorsTransitionLevel` on `MapsIndoorsWidget` had no effect
* Fixed error when parsing `MPRoute` objects

### Changed

* Updated MapsIndoors SDKs:
  * iOS to 4.8.3

## \[4.0.2] 2025-01-07

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.9.1
  * iOS to 4.8.1

## \[4.0.1] 2024-12-11

**Fixed**

* Improved rendering performance of Mapbox Map view especially when pinch zooming.

### Changed

* Updated MapsIndoors SDKs:
  * iOS to 4.8.0

## \[4.0.0] 2024-11-28

Visit the [migration guide](/sdks-and-frameworks/flutter/migration-guide.md) to see what changes are needed to upgrade from v3 to v4.

### Added

* Added `initialCameraPosition: MPCameraPosition` to the `MapWidget` constructor. If set, the initial position of the camera will be moved to the given `MPCameraPosition`.

### Changed

* Changed all uses of color `String`s to use `dart:ui` `Color` instead.
* Updated MapsIndoors SDKs:
  * Android to 4.9.0
  * iOS to 4.7.0

### Removed

* `ClearWayType` has been removed, use `ClearAvoidWayType` instead.

## \[3.1.3] 2024-10-31

### Fixed

* Fixed custom floorselectors not working properly on iOS

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.8.12
  * iOS to 4.6.2

## \[3.1.2] 2024-10-25

### Fixed

* Fixed issue where camera events would not be propagated to the Flutter layer on iOS
* Fixed behavior where iOS would throw an error when `getLocationById` could not find a location, it now returns null like on Android
* Fixed `setCollisionHandling` on `MPSolutionConfig` causing a crash
* Fixed `moveCamera`/`AnimateCamera` from a `MPCameraPosition` would not work on iOS

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.8.11 (Mapbox only)

## \[3.1.1] 2024-10-16

### Fixed

* Fixed issue where camera events would not be propagated to the Flutter layer
* Fixed issue on iOS where setting a custom floor selector
* Fixed issue on Android where `goTo(MPLocation)` did not function properly
* Fixed tilt not being applied when moving the camera using a `MPCameraUpdate` on iOS
* Fixed blank screen on Android when not using the `MapsindoorsStyle`

### Changed

* Updated MapsIndoors SDKs:
* Android to 4.8.11 (Google Maps only)
* iOS to 4.6.1

## \[3.1.0] 2024-09-11

### Added

* Added functionality for Android to update the map whenever a Display Rule is changed
* Added method on MapsIndoorsWidget to disable built-in compass

### Changed

* Disabled Mapbox Attributions button on Android as it would crash when clicked
* Updated MapsIndoors SDKs:
  * Android to 4.8.9
  * iOS to 4.5.14

## \[3.0.2] 2024-08-27

### Fixed

* Completed fix for build issue on Android devices
* Fixed issues where updating display rules would not trigger a refresh on iOS

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.8.8
  * iOS to 4.5.12

## \[3.0.1] 2024-07-08

**Fixed**

* Fixed build error when using Google Maps on Android

## \[3.0.0] 2024-06-26

### Added

* Added `setHighlight` and `clearHighlight` to `MapControlWidget` which allows you to highlight a list of locations
* Added new `MPCameraViewFitMode`: `none`, which will disable automatic camera movement when changing legs
* Added `addExcludeWayType`, `clearExcludeWayType` to `MPDirectionsService` to allow the user to exclude specific `MPHighway`s when querying for a route.
* Added two new `MPSolutionDisplayRuleEnum`s `selection` and `highlight` that allows you to modify the look of highlighted and selected Locations.
* Added support for Flat and Graphic labels, as well as 3D models
* Added new setters and getters to `MPDisplayRule`:
  * `LabelStyleGraphic`
  * `LabelType`
  * `IconScale`
  * `IconPlacement`
  * `PolygonLightnessFactor`
  * `WallLightnessFactor`
  * `ExtrusionLightnessFactor`
  * `LabelStyleTextSize`
  * `LabelStyleTextColor`
  * `LabelStyleTextOpacity`
  * `LabelStyleHaloOpacity`
  * `LabelStyleHaloWidth`
  * `LabelStyleHaloBlur`
  * `LabelStyleBearing`
  * `BadgeVisibile`
  * `BadgeZoomFrom`
  * `BadgeZoomTo`
  * `BadgeRadius`
  * `BadgeStrokeWidth`
  * `BadgeStrokeColor`
  * `BadgeFillColor`
  * `BadgePosition`
  * `Model3DModel`
  * `Model3DRotationX`
  * `Model3DRotationY`
  * `Model3DrotationZ`
  * `Model3DScale`
  * `Model3DZoomFrom`
  * `Model3DZoomTo`
  * `Model3DVisible`
* Added functionality to hide specific features from the map
  * `setHiddenFeatures` set a list of `MPFeatureType` to be hidden from the map
  * `getHiddenFeatures` get a list of currently hidden `MPFeatureType`
* Added optional venue loading, use loadMapsIndoorsWithVenues(key, venueIds) to load a specific set of venues
  * Venues can be added and removed from load at any time by using `addVenueToSync(venueId)` and `removeVenueToSync(venueId)`
  * Track the status of venues by adding a listener with `addOnVenueStatusChangedListener(MPVenueStatusListener)`
  * Get a list of synced venues with `getSyncedVenues()`
* Added functionality to disable automatic floor and building selection when moving the map
  * `setBuildingSelectionMode` set a Selection mode for Buildings on the map with `MPSelectionMode` (`automatic` or `manual`)
  * `setFloorSelectionMode` set a Selection mode for Floors on the map with `MPSelectionMode` (`automatic` or `manual`)
* Added functionality to make locations `selectable`.
  * This setting can be found on `MPLoction`, `MPPOIType` and `MPSolutionConfig`
  * Added `MPPOIType` which can be fetched from `MPSolution`
* Added `mapsIndoorsTransitionLevel` to MapsIndoorsWidget ctor
  * Sets the zoom level at which the MapsIndoors data should show, instead of extruded buildings on Mapbox Maps. Can be set to 0, if extruded buildings should not show.
* Added multi-stop navigation: It is now possible to add multiple stops to routes.
  * The existing `getRoute` method gets two optional parameters `stops` and `optimize`
  * `stops` will add the stops to the route between the `origin` and `destination`
  * `optimize` will rearrange the `stops` to make a more optimal route, but `origin` and `destination` will stay the same.

### Changed

* Updated MapsIndoors SDKs:
  * Android to 4.8.5
  * iOS to 4.5.7

### Deprecated

* Deprecated `clearWayType`: use `clearAvoidWayType` instead

## \[2.1.6] 2024-05-03

### Changed

* Updated MapsIndoors SDKs
  * iOS to 4.3.11

## \[2.1.5] 2024-03-25

### Changed

* Updated MapsIndoors SDKs
  * Android to 4.4.1
  * iOS to 4.3.8

## \[2.1.4] 2024-02-28

### Changed

* Updated MapsIndoors Android SDK 4.3.4

**Fixed**

* Fixed issue with not being able to always get a correct route involving one way paths.

## \[2.1.3] 2024-02-13

**Changed**

* New Example app included.

**Fixed**

* Fixed another issue where `OnMapReadyListener` would not be invoked during the initial load on iOS.
* Fixed issues where `setOnMarkerClickListener`, `setOnMapClickListener` and `setOnLocationSelectedListener` would not accept being called with optional parameters.

## \[2.1.2] 2024-02-01

### Changed

* Updated MapsIndoors SDKs
  * Android to 4.2.12
  * iOS to 4.2.14

## \[2.1.1] 2024-01-24

### Fixed

* Fixed issue where `OnMapReadyListener` would not be invoked during the initial load on iOS.

## \[2.1.0] 2024-01-11

### Changed

* Updated MapsIndoors SDKs
  * Android to 4.2.10
  * iOS to 4.2.13

### Added

* Added `showRouteLegButtons` to `MPDirectionsRenderer`
* Added `setLabelOptions` to `MapsindoorsWidget`

## \[2.0.0] 2023-08-15

### Changed

* Moved from [mapsindoors](https://pub.dev/packages/mapsindoors) to allow for multiple map providers
* Changes to classes:
  * MapControl
    * `MapControl` has merged with the `MapsIndoorsWidget`, combining them into a single entity. the `Widget` will still be built in the build tree, and accepts a listener as a parameter to wait for the MapControl part to be initialized.
  * MapsIndoors
    * Has been split up into functions on the namespace to align better with dart language standards. Some methods have changed naming to avoid collision with popular method and parameter naming (eg. `MapsIndoors.load` is now `loadMapsIndoors`)
* Changes to the Widget
  * The `MapsIndoorsWidget` has been changed to be a [`UniqueWidget`](https://api.flutter.dev/flutter/widgets/UniqueWidget-class.html), this is to ensure that the underlying MapsIndoors in the platform code can function normally.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.mapsindoors.com/other/changelog/flutter-plugin.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
