Flutter谷歌地图导航功能插件google_maps_navigation的使用
Flutter谷歌地图导航功能插件google_maps_navigation的使用
描述
此存储库包含一个Flutter插件,该插件为面向Android和iOS的应用程序提供了一个Google导航小部件。
注意
此包在达到1.0版本之前处于Beta状态。根据语义化版本控制,在1.0之前可能会引入破坏性更改。
要求
Android
Android | |
---|---|
最低移动操作系统支持 | API级别23+ |
iOS
iOS | |
---|---|
最低移动操作系统支持 | iOS 14.0+ |
- 一个Flutter项目
- 一个启用出行解决方案的Google云项目,例如按需乘车和送货或最后一英里车队解决方案。这需要您按照出行服务文档中的描述联系销售。
- 在该Google云项目中,根据您的Flutter应用程序的目标,还需要启用以下四个产品:
- 从上述项目获取的API密钥
- 如果目标是Android,则需要安装并启用Google Play服务
- 将 attribution和许可文本添加到您的应用中
重要
为了增强安全性和成本管理,将API密钥的使用限制在"导航SDK"、"Android版地图SDK"和"iOS版地图SDK"上。这有助于防止未经授权使用您的API密钥。
安装
- 要将Google导航插件添加到项目中,请使用以下命令:
pub add google_navigation_flutter
- 设置目标平台的最低版本。
Android
在android/app/build.gradle
文件中设置minSdkVersion
:
android {
defaultConfig {
minSdkVersion 23
}
}
iOS
- 打开
ios/Podfile
配置文件。 - 在Podfile的开头添加以下行:
platform :ios, '14.0'
- 使用这些说明向Flutter项目添加API密钥。这些步骤适用于Android(build.gradle)和iOS(AppDelegate.swift)文件。
要安全地加载您的API密钥,可以使用Secrets Gradle插件。此插件有助于管理API密钥而不将其暴露在应用源代码中。
更多详细信息,请参阅Google导航SDK文档。
使用
现在可以在小部件树中添加一个GoogleMapsNavigationView
小部件。
可以通过通过onViewCreated
回调传递的GoogleNavigationViewController
来控制视图。
GoogleMapsNavigationView
小部件应在一个具有限定大小的小部件内使用。如果在其无边界小部件中使用,将导致应用程序抛出Flutter异常。
添加导航视图
import 'package:flutter/material.dart';
import 'package:google_maps_navigation/google_maps_navigation.dart';
class NavigationSample extends StatefulWidget {
const NavigationSample({Key? key}) : super(key: key);
[@override](/user/override)
State<NavigationSample> createState() => _NavigationSampleState();
}
class _NavigationSampleState extends State<NavigationSample> {
GoogleNavigationViewController? _navigationViewController;
bool _navigationSessionInitialized = false;
[@override](/user/override)
void initState() {
super.initState();
_initializeNavigationSession();
}
Future<void> _initializeNavigationSession() async {
if (!await GoogleMapsNavigator.areTermsAccepted()) {
await GoogleMapsNavigationManager.showTermsAndConditionsDialog(
'Example title',
'Example company',
);
}
// 注意:确保用户已授予位置权限后再开始导航会话。
await GoogleMapsNavigator.initializeNavigationSession();
setState(() {
_navigationSessionInitialized = true;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Google Maps Navigation Sample')),
body: _navigationSessionInitialized
? GoogleMapsNavigationView(
onViewCreated: _onViewCreated,
initialNavigationUIEnabledPreference: NavigationUIEnabledPreference.disabled,
// 其他视图初始化设置
)
: const Center(child: CircularProgressIndicator()),
);
}
void _onViewCreated(GoogleNavigationViewController controller) {
_navigationViewController = controller;
controller.setMyLocationEnabled(true);
// 可以在此处添加其他设置。
}
[@override](/user/override)
void dispose() {
if (_navigationSessionInitialized) {
GoogleMapsNavigator.cleanup();
}
super.dispose();
}
}
查看示例目录中的完整导航示例应用。
请求和处理权限
Google导航SDK Flutter插件提供了需要特定移动操作系统权限的功能。这些包括但不限于位置服务、后台执行和接收后台位置更新。
注意
这些权限的管理超出了Android和iOS导航SDK的范围。作为集成这些SDK到应用程序的开发者,您负责请求并获得应用用户的必要权限。
您可以查看示例应用的main.dart
文件中的权限处理示例:
PermissionStatus _locationPermissionStatus = PermissionStatus.denied;
// ...
/// 请求访问设备位置的权限。
///
/// Android: 精确和粗略位置
/// iOS: CoreLocation(始终和当应用使用时)
Future<void> _requestLocationPermission() async {
final PermissionStatus status = await Permission.location.request();
setState(() {
_locationPermissionStatus = status;
});
}
// ...
[@override](/user/override)
Widget build(BuildContext context) {
_requestLocationPermission();
...
}
更多关于Flutter谷歌地图导航功能插件google_maps_navigation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter谷歌地图导航功能插件google_maps_navigation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,使用google_maps_navigation
插件可以帮助你集成谷歌地图的导航功能。虽然google_maps_navigation
并不是官方直接维护的插件,但有一些社区插件可以实现类似的功能。通常,我们会结合google_maps_flutter
和URL Scheme来实现导航功能。
以下是一个简单的例子,展示如何在Flutter中使用google_maps_flutter
插件显示地图,并通过URL Scheme启动谷歌地图应用进行导航。
首先,确保在你的pubspec.yaml
文件中添加google_maps_flutter
依赖:
dependencies:
flutter:
sdk: flutter
google_maps_flutter: ^2.1.1 # 请检查最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,创建一个Flutter应用,并在其中集成地图和导航功能。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:url_launcher/url_launcher.dart'; // 用于启动URL
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MapScreen(),
);
}
}
class MapScreen extends StatefulWidget {
@override
_MapScreenState createState() => _MapScreenState();
}
class _MapScreenState extends State<MapScreen> {
final Completer<GoogleMapController> _controller = Completer();
void _navigateToDestination() async {
String destination = "San Francisco, CA"; // 目标地址
String googleMapsUrl =
"https://www.google.com/maps/dir/?api=1&destination=$destination";
if (await canLaunchUrl(Uri.parse(googleMapsUrl))) {
await launchUrl(Uri.parse(googleMapsUrl));
} else {
throw "Could not launch $googleMapsUrl";
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Google Maps Navigation Example'),
),
body: GoogleMap(
mapType: MapType.normal,
initialCameraPosition: CameraPosition(
target: LatLng(37.7749, -122.4194), // 初始位置,例如旧金山
zoom: 14.0,
),
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
),
floatingActionButton: FloatingActionButton(
onPressed: _navigateToDestination,
tooltip: 'Navigate',
child: Icon(Icons.directions),
),
);
}
}
注意:
- 在上面的代码中,我们使用了
url_launcher
插件来启动URL。你需要在pubspec.yaml
中添加这个依赖:
dependencies:
url_launcher: ^6.0.9 # 请检查最新版本号
-
确保你的应用有权限启动其他应用(即访问URL)。在Android上,这通常不需要额外的权限配置,但在iOS上,你可能需要在
Info.plist
中添加LSApplicationQueriesSchemes
来指定可以启动的URL Scheme,例如comgooglemaps
(尽管在上面的例子中我们直接使用了网页版的URL)。 -
由于直接使用URL Scheme可能无法在所有情况下都工作(例如,如果设备上未安装谷歌地图应用),因此建议在实际应用中添加适当的错误处理和用户提示。
这个示例展示了如何在Flutter应用中集成地图显示和基本的导航功能。如果你需要更复杂的功能,例如路线规划、实时导航等,你可能需要探索更高级的解决方案或自定义实现。