Flutter地图导航插件navigation_with_mapbox的使用
Flutter地图导航插件 navigation_with_mapbox
的使用
navigation_with_mapbox
是一个用于在Flutter应用中添加逐向导航功能的插件,它基于MapBox服务。以下是详细的配置和示例代码。
配置指南
Android 配置
-
获取并设置Mapbox访问令牌:你需要从Mapbox账户页面获取一个访问令牌,并将其添加到
android/app/src/main/res/values/strings.xml
文件中,键名为mapbox_access_token
。<resources> <string name="mapbox_access_token" translatable="false">ADD_MAPBOX_ACCESS_TOKEN_HERE</string> </resources>
-
添加权限:在AndroidManifest.xml中添加以下权限:
<manifest> ... <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ... </manifest>
-
下载Mapbox二进制文件所需的令牌:将具有
downloads:read
作用域的MapBox下载令牌添加到你的gradle.properties文件中。MAPBOX_DOWNLOADS_TOKEN=sk.xxxxx
iOS 配置
-
创建并设置下载令牌:在
.netrc
文件中添加具有DOWNLOADS:READ
作用域的Mapbox API令牌。 -
设置Mapbox访问令牌:在Info.plist中设置
MBXAccessToken
为你的访问令牌。 -
设置位置使用描述:设置
NSLocationWhenInUseUsageDescription
以说明应用为何需要访问用户的位置信息。 -
后台模式:启用“音频、AirPlay和画中画”以及“位置更新”的后台模式,或者在Info.plist中添加相应的
UIBackgroundModes
值。
示例代码
下面是一个完整的Flutter应用程序示例,展示了如何使用navigation_with_mapbox
插件进行导航。
import 'package:flutter/material.dart';
import 'dart:io' as io;
import 'package:navigation_with_mapbox/navigation_with_mapbox.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _navigationWithMapboxPlugin = NavigationWithMapbox();
MapboxOptions? _options;
late Stream<int> listenEvents;
late StreamSubscription _statusViewSubscription;
bool _controlView = false;
[@override](/user/override)
void initState() {
super.initState();
initPlatformState();
listenEvents = MapboxNavigationView.getStateMapboxView;
}
Future<void> initPlatformState() async {
if (!mounted) return;
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: Column(
children: [
Flexible(
child: Stack(
children: [
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: io.Platform.isAndroid
? () async {
await _navigationWithMapboxPlugin.startNavigation(
origin: WayPoint(latitude: 4.809432, longitude: -75.700660),
destination: WayPoint(latitude: 4.759335, longitude: -75.923914),
setDestinationWithLongTap: true,
simulateRoute: false,
alternativeRoute: true,
style: 'traffic_night',
language: 'es',
profile: 'driving',
voiceUnits: 'imperial',
msg: '¡Buen viaje, disfruta de tu recorrido!',
);
}
: null,
child: const Text('Start Navigation Android'),
),
ElevatedButton(
onPressed: io.Platform.isIOS
? () {
var options = MapboxOptions(
origin: WayPoint(latitude: 4.809432, longitude: -75.700660),
destination: WayPoint(latitude: 4.759335, longitude: -75.923914),
setDestinationWithLongTap: true,
simulateRoute: false,
language: 'es',
profile: 'drivingWithTraffic',
style: 'dark',
voiceUnits: 'imperial',
);
setState(() {
_options = options;
_controlView = true;
});
_statusViewSubscription = listenEvents.listen(_statusView);
}
: null,
child: const Text('Start Navigation Ios'),
),
],
),
),
if (_controlView)
MapboxNavigationView(mapboxOptions: _options!),
],
),
),
],
),
),
),
);
}
_statusView(event) {
if (event == 2) {
setState(() {
_controlView = false;
});
_statusViewSubscription.cancel();
}
}
}
更多关于Flutter地图导航插件navigation_with_mapbox的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图导航插件navigation_with_mapbox的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用navigation_with_mapbox
插件来实现地图导航功能的代码示例。这个插件允许你集成Mapbox的导航功能到你的Flutter应用中。
首先,确保你已经在pubspec.yaml
文件中添加了navigation_with_mapbox
依赖:
dependencies:
flutter:
sdk: flutter
navigation_with_mapbox: ^最新版本号 # 请替换为实际最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你需要配置Mapbox的访问令牌。你可以通过Mapbox官网获取一个免费的访问令牌,并将其添加到你的应用中。
以下是一个完整的示例代码,展示如何在Flutter中使用navigation_with_mapbox
插件:
import 'package:flutter/material.dart';
import 'package:navigation_with_mapbox/navigation_with_mapbox.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Mapbox Navigation Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MapboxNavigationScreen(),
);
}
}
class MapboxNavigationScreen extends StatefulWidget {
@override
_MapboxNavigationScreenState createState() => _MapboxNavigationScreenState();
}
class _MapboxNavigationScreenState extends State<MapboxNavigationScreen> {
late MapboxNavigationController _mapboxNavigationController;
late MapboxMapController _mapboxMapController;
@override
void initState() {
super.initState();
// 初始化Mapbox Navigation Controller
_mapboxNavigationController = MapboxNavigationController(
accessToken: '你的Mapbox访问令牌', // 请替换为你的Mapbox访问令牌
origin: LatLng(37.7749, -122.4194), // 起点坐标
destination: LatLng(34.0522, -118.2437), // 终点坐标
);
// 设置导航事件监听器
_mapboxNavigationController.addOnNavigationReadyListener(() {
print("Navigation is ready");
});
_mapboxNavigationController.addOnNavigationRunningListener(() {
print("Navigation is running");
});
_mapboxNavigationController.addOnArrivalListener(() {
print("Destination arrived");
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Mapbox Navigation Example'),
),
body: MapboxMap(
accessToken: '你的Mapbox访问令牌', // 请替换为你的Mapbox访问令牌
onMapCreated: (controller) {
_mapboxMapController = controller;
// 设置导航图层
_mapboxNavigationController.setupNavigationWithMap(controller);
// 开始导航
_mapboxNavigationController.startNavigation();
},
initialCameraPosition: CameraPosition(
target: LatLng(37.7749, -122.4194), // 初始地图位置
zoom: 10.0,
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 停止导航
_mapboxNavigationController.stopNavigation();
},
tooltip: 'Stop Navigation',
child: Icon(Icons.stop),
),
);
}
@override
void dispose() {
_mapboxNavigationController.dispose();
_mapboxMapController.dispose();
super.dispose();
}
}
在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个Mapbox地图和一个浮动操作按钮(FAB)。点击FAB将停止导航。地图会在初始化时设置起点和终点,并启动导航。
请确保你已经替换了accessToken
为你自己的Mapbox访问令牌,并且起点和终点的坐标已经根据你的需求进行了调整。
这个示例演示了如何使用navigation_with_mapbox
插件的基本功能,但你可以根据需要进一步自定义和扩展它。