iNavi Global Navigation SDK Plugin
A Flutter plugin that wraps the iNavi NaviSDK Core for Android and iOS, exposing native map display, map controls, search, routing, and guidance UI through a single Dart API.
SDK App Key Required — An iNavi-issued app key must be configured on both platforms before the SDK can initialize. Contact visit visit the Maps Platform to request a key.
Features
- Native map rendering via
NaviMapView(AndroidPlatformView/ iOSUiKitView) - SDK initialization with an event-driven readiness signal (
onInitEvent) - Map interactions: mode changes, tap events, camera move phase
- Location and country change events
- Route search and turn-by-turn guidance state streaming
- Unified Dart API backed by Android (Kotlin/KMP) and iOS (Swift) implementations
Requirements
| Platform | Minimum version |
|---|---|
| Android | API 23 (Android 6.0) |
| iOS | 14.0 |
| Xcode | 16 or later |
| Flutter | 3.x |
Installation
Add inavi_global_navi_flutter to your pubspec.yaml:
dependencies:
inavi_global_navi_flutter: ^1.0.0
Then run:
flutter pub get
Platform Setup
Android
1. Add the iNavi Maven repository
The Android SDK artifacts are served from the iNavi Artifactory repository. Add the repository to your host app's Gradle configuration.
In android/settings.gradle (or android/build.gradle for older project structures):
dependencyResolutionManagement {
repositories {
// ... other repositories
maven { url "https://repo.inavi.com/artifactory/navigation" }
}
}
2. Declare permissions
Add the following entries to android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
Request runtime location permission in your app before calling any navigation API.
3. Set the SDK app key
Inside the <application> element of android/app/src/main/AndroidManifest.xml:
<application ...>
<!-- ... -->
<meta-data
android:name="com.inavi.navisdk.appkey"
android:value="YOUR_APP_KEY_HERE" />
</application>
Replace YOUR_APP_KEY_HERE with your iNavi-issued app key.
iOS
1. Add Info.plist entries
Add location usage descriptions and background modes to ios/Runner/Info.plist:
<!-- Location permission descriptions -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs your location to provide navigation guidance.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app needs your location in the background to continue navigation.</string>
<!-- Background modes required for navigation -->
<key>UIBackgroundModes</key>
<array>
<string>location</string>
<string>audio</string>
</array>
2. Set the SDK app key
In the same ios/Runner/Info.plist:
<key>INaviAppKey</key>
<string>YOUR_APP_KEY_HERE</string>
Replace YOUR_APP_KEY_HERE with your iNavi-issued app key.
3. Install CocoaPods dependencies
From the host app's ios/ directory, run:
cd ios
pod install --repo-update
The plugin podspec references Global-iNavi-Navigation-SDK from the public CocoaPods
CDN, so no additional source entry is required in your Podfile. The --repo-update
flag refreshes the local CDN cache to ensure the pinned version is available.
Bundled xcframeworks: iNaviNavigationSdk · NaviSDKIOS · NaviSDKMMC · NaviSDKROUTE · NaviSDKCore · MapLibre
Usage
1. Import the package
import 'package:inavi_global_navi_flutter/inavi_global_navi_flutter.dart';
2. Display the map
Embed NaviMapView in your widget tree. The native view is created asynchronously;
use the onPlatformViewCreated callback to know when it is ready:
NaviMapView(
onPlatformViewCreated: (int viewId) {
// Native map view is ready.
},
)
3. Initialize the SDK
Use NaviController.instance (a singleton) to interact with the SDK. Call
initializeNavi() after the map view is ready, and wait for the onInitEvent
stream before invoking any other API:
final navi = NaviController.instance;
late final StreamSubscription<InitEvent> _initSub;
@override
void initState() {
super.initState();
_initSub = navi.onInitEvent.listen((event) {
if (event.isSuccess) {
// SDK is ready — safe to call map/search/route/guidance APIs.
} else {
debugPrint('SDK init failed: ${event.errorCode} ${event.errorMessage}');
}
});
}
Future<void> _startSdk() async {
await navi.initializeNavi();
}
@override
void dispose() {
_initSub.cancel();
super.dispose();
}
initializeNavi() sends the initialization request to the native layer.
The onInitEvent stream emits the result asynchronously.
4. Listen to map and guidance events
// Map tap
navi.onMapClickEvent.listen((event) {
final lat = event.latitude;
final lng = event.longitude;
});
// Camera move phase
navi.onMapMoveEvent.listen((event) { ... });
// Map mode change
navi.onMapModeEvent.listen((event) { ... });
// Guidance state (start / stop / reroute, etc.)
navi.onGuidanceStateEvent.listen((event) { ... });
// Country change
navi.onCountryEvent.listen((event) { ... });
Use only APIs and streams documented by the official NaviSDK guide. Undocumented or internal symbols may change without notice and are not supported.
Example App
A complete integration example is available in the example/ directory. It covers
platform permission handling, SDK app key placement, initialization, search, routing,
guidance start/stop, and map controls.
cd example
flutter pub get
flutter run
Grant location permission on the device before running; the SDK requires it for positioning and navigation guidance.
Additional Information
- SDK documentation: refer to the official iNavi NaviSDK guide for supported APIs, event payloads, and behavioral guarantees.
- Issues: report bugs or feature requests via the project issue tracker.
- App key requests: contact iNavi at https://www.inavi.com.
License
See LICENSE for details.
Libraries
- Public API barrel for the NaviSDK Flutter plugin.