Flutter地图导航插件mappls_direction_plugin的使用
Flutter地图导航插件mappls_direction_plugin的使用
简介
mappls_direction_plugin
是一个用于在 Flutter 应用中展示路线的地图导航组件。它支持多种功能,包括地点搜索、车辆类型选择等。
功能
- 支持 Mappls 地点搜索,用于搜索起点、终点和途经点。
- 可以使用数字地址(分号分隔)、Mappls 地图标记或 WGS 84 经纬度坐标。
- 可以设置车辆类型,如驾车、步行和骑行。
- 轻松设置交通信息和预计到达时间资源。
开始使用
添加依赖
首先,在 pubspec.yaml
文件中添加 mappls_direction_plugin
依赖:
dependencies:
mappls_direction_plugin: ^1.0.0
然后在 Dart 代码中导入该包:
import 'package:mappls_direction_plugin/mappls_direction_plugin.dart';
添加 Mappls 密钥
必须通过 MapplsAccountManager
类提供您的密钥。
MapplsAccountManager.setMapSDKKey("YOUR_MAP_SDK_KEY");
MapplsAccountManager.setRestAPIKey("YOUR_REST_API_KEY");
MapplsAccountManager.setAtlasClientId("YOUR_ATLAS_CLIENT_ID");
MapplsAccountManager.setAtlasClientSecret("YOUR_ATLAS_CLIENT_SECRET");
使用 Direction Widget
打开 Direction Widget
使用 openDirectionWidget
方法打开 Direction Widget:
DirectionCallback directionCallback;
try {
directionCallback = await openDirectionWidget(directionOptions: options);
} on PlatformException {
directionCallback = DirectionCallback(null, null);
}
设置 Direction Options
可以使用 DirectionOptions
来设置组件的属性:
DirectionOptions options = DirectionOptions(
showStartNavigation: true, // 是否显示开始导航按钮
showAlternative: true, // 是否显示替代路线
steps: true, // 是否返回每个路线段的步骤
resource: DirectionsCriteria.RESOURCE_ROUTE, // 资源类型
profile: DirectionsCriteria.PROFILE_DRIVING, // 车辆类型
overview: DirectionsCriteria.OVERVIEW_FULL, // 概览类型
excludes: [DirectionsCriteria.EXCLUDE_TOLL], // 避免的道路类型
searchPlaceOption: PlaceOptions(), // 搜索选项
destination: DirectionPoint(location: LatLng(28.5355, 77.3910)), // 目的地
);
完整示例
以下是一个完整的示例,展示了如何在 Flutter 应用中使用 mappls_direction_plugin
插件:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mappls_direction_plugin_example/DirectionSettings.dart';
import 'package:mappls_direction_plugin_example/settingWidget.dart';
import 'package:mappls_gl/mappls_gl.dart';
import 'package:mappls_direction_plugin/mappls_direction_plugin.dart';
void main() {
runApp(MaterialApp(
home: MyApp(),
routes: <String, WidgetBuilder>{
'SettingWidget': (BuildContext context) => SettingWidget(),
},
));
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
static const String MAP_SDK_KEY = "YOUR_MAP_SDK_KEY";
static const String REST_API_KEY = "YOUR_REST_API_KEY";
static const String ATLAS_CLIENT_ID = "YOUR_ATLAS_CLIENT_ID";
static const String ATLAS_CLIENT_SECRET = "YOUR_ATLAS_CLIENT_SECRET";
DirectionCallback _directionCallback = DirectionCallback(null, null);
[@override](/user/override)
void initState() {
super.initState();
MapplsAccountManager.setMapSDKKey(MAP_SDK_KEY);
MapplsAccountManager.setRestAPIKey(REST_API_KEY);
MapplsAccountManager.setAtlasClientId(ATLAS_CLIENT_ID);
MapplsAccountManager.setAtlasClientSecret(ATLAS_CLIENT_SECRET);
}
Future<void> openMapplsDirectionWidget() async {
DirectionCallback directionCallback;
DirectionSettings settings = DirectionSettings();
PlaceOptions placeOptions = PlaceOptions(
tokenizeAddress: settings.tokenizeAddress,
saveHistory: settings.saveHistory,
historyCount: settings.historyCount != null ? int.parse(settings.historyCount!) : null,
backgroundColor: settings.backgroundColor,
toolbarColor: settings.toolbarColor,
toolbarTintColor: settings.toolbarTintColor,
zoom: settings.zoom != null ? double.parse(settings.zoom!) : null,
location: settings.longitude != null && settings.latitude != null
? LatLng(double.parse(settings.latitude!), double.parse(settings.longitude!))
: null,
filter: settings.filter != null ? settings.filter : null,
);
DirectionOptions options = DirectionOptions(
showStartNavigation: settings.showStartNavigation,
showAlternative: settings.showAlternative,
steps: settings.showSteps,
resource: settings.resource,
profile: settings.profile,
overview: settings.overView,
excludes: settings.excludes.length == 0 ? null : settings.excludes,
searchPlaceOption: placeOptions,
destination: settings.mapplsPin != null
? DirectionPoint(settings.placeName!, settings.placeAddress!, mapplsPin: settings.mapplsPin)
: settings.dLng != null && settings.dLat != null
? DirectionPoint(settings.placeName!, settings.placeAddress!, location: LatLng(double.parse(settings.dLat!), double.parse(settings.dLng!)))
: null,
);
try {
directionCallback = await openDirectionWidget(directionOptions: options);
} on PlatformException {
directionCallback = DirectionCallback(null, null);
}
print(json.encode(directionCallback.directionResponse?.toMap()));
if (!mounted) return;
setState(() {
_directionCallback = directionCallback;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Direction Example'),
actions: <Widget>[
IconButton(
icon: Icon(Icons.settings, color: Colors.white),
onPressed: () {
Navigator.pushNamed(context, 'SettingWidget');
},
)
],
),
body: Center(
child: Column(children: [
SizedBox(height: 20),
Text(_directionCallback.selectedIndex == null
? 'Selected Index: '
: 'Selected Index: ${_directionCallback.selectedIndex}'),
SizedBox(height: 20),
Text(_directionCallback.directionResponse?.waypoints == null
? 'Distance: '
: 'Distance: ${_directionCallback.directionResponse?.routes?[0].distance}'),
SizedBox(height: 20),
Text(_directionCallback.directionResponse?.waypoints == null
? 'Duration: '
: 'Duration: ${_directionCallback.directionResponse?.routes?[0].duration}'),
SizedBox(height: 20),
TextButton(
child: Text('Open Direction Widget'),
onPressed: () => openMapplsDirectionWidget(),
),
]),
),
),
);
}
}
更多关于Flutter地图导航插件mappls_direction_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
mappls_direction_plugin
是一个用于 Flutter 的插件,它允许开发者在应用程序中集成 MapmyIndia 的导航和方向服务。这个插件可以帮助你在地图上显示路线、计算距离和预计到达时间(ETA),以及提供导航指引。
以下是如何在 Flutter 项目中使用 mappls_direction_plugin
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 mappls_direction_plugin
的依赖:
dependencies:
flutter:
sdk: flutter
mappls_direction_plugin: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 初始化插件
在使用插件之前,你需要进行初始化。通常,你可以在 main.dart
文件中进行初始化:
import 'package:mappls_direction_plugin/mappls_direction_plugin.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化 MapmyIndia 方向插件
await MapplsDirectionPlugin.initialize('YOUR_MAPMYINDIA_API_KEY');
runApp(MyApp());
}
请确保将 YOUR_MAPMYINDIA_API_KEY
替换为你在 MapmyIndia 开发者平台上获取的有效 API 密钥。
3. 使用插件进行导航
你可以使用 MapplsDirectionPlugin
来获取路线、距离和 ETA。以下是一个简单的示例,展示如何获取两点之间的路线:
import 'package:flutter/material.dart';
import 'package:mappls_direction_plugin/mappls_direction_plugin.dart';
class NavigationScreen extends StatefulWidget {
@override
_NavigationScreenState createState() => _NavigationScreenState();
}
class _NavigationScreenState extends State<NavigationScreen> {
String _routeInfo = '';
Future<void> _getRoute() async {
try {
// 定义起点和终点坐标
LatLng origin = LatLng(28.6129, 77.2295); // 例如:德里
LatLng destination = LatLng(28.4843, 77.0677); // 例如:古尔冈
// 获取路线信息
DirectionResponse response = await MapplsDirectionPlugin.getRoute(origin, destination);
// 显示路线信息
setState(() {
_routeInfo = 'Distance: ${response.distance} km\nETA: ${response.duration}';
});
} catch (e) {
setState(() {
_routeInfo = 'Error: $e';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('MapmyIndia Navigation'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: _getRoute,
child: Text('Get Route'),
),
SizedBox(height: 20),
Text(_routeInfo),
],
),
),
);
}
}
4. 显示地图和路线
如果你想要在地图上显示路线,你可以使用 mappls_map_plugin
来显示地图,并将 mappls_direction_plugin
获取的路线数据传递给地图插件进行渲染。
import 'package:flutter/material.dart';
import 'package:mappls_map_plugin/mappls_map_plugin.dart';
import 'package:mappls_direction_plugin/mappls_direction_plugin.dart';
class MapScreen extends StatefulWidget {
@override
_MapScreenState createState() => _MapScreenState();
}
class _MapScreenState extends State<MapScreen> {
MapplsMapController? _mapController;
Future<void> _showRouteOnMap() async {
LatLng origin = LatLng(28.6129, 77.2295); // 例如:德里
LatLng destination = LatLng(28.4843, 77.0677); // 例如:古尔冈
DirectionResponse response = await MapplsDirectionPlugin.getRoute(origin, destination);
_mapController?.addPolyline(PolylineOptions(
geometry: response.geometry,
polylineColor: Colors.blue,
polylineWidth: 5,
));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Map with Route'),
),
body: MapplsMap(
onMapCreated: (controller) {
_mapController = controller;
},
initialCameraPosition: CameraPosition(
target: LatLng(28.6129, 77.2295), // 初始地图中心
zoom: 12,
),
),
floatingActionButton: FloatingActionButton(
onPressed: _showRouteOnMap,
child: Icon(Icons.directions),
),
);
}
}
5. 处理导航
mappls_direction_plugin
还可以用于启动导航。你可以使用 startNavigation
方法来启动导航:
await MapplsDirectionPlugin.startNavigation(origin, destination);