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 (Android PlatformView / iOS UiKitView)
  • 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

inavi_global_navi_flutter
Public API barrel for the NaviSDK Flutter plugin.