Flutter谷歌地图导航功能插件google_maps_navigation的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter谷歌地图导航功能插件google_maps_navigation的使用

描述

此存储库包含一个Flutter插件,该插件为面向Android和iOS的应用程序提供了一个Google导航小部件。

注意

此包在达到1.0版本之前处于Beta状态。根据语义化版本控制,在1.0之前可能会引入破坏性更改。

要求

Android

Android
最低移动操作系统支持 API级别23+

iOS

iOS
最低移动操作系统支持 iOS 14.0+

重要

为了增强安全性和成本管理,将API密钥的使用限制在"导航SDK"、"Android版地图SDK"和"iOS版地图SDK"上。这有助于防止未经授权使用您的API密钥。

安装

  1. 要将Google导航插件添加到项目中,请使用以下命令:
pub add google_navigation_flutter
  1. 设置目标平台的最低版本。

Android

android/app/build.gradle文件中设置minSdkVersion

android {
    defaultConfig {
        minSdkVersion 23
    }
}

iOS

  1. 打开ios/Podfile配置文件。
  2. 在Podfile的开头添加以下行:
platform :ios, '14.0'
  1. 使用这些说明向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

1 回复

更多关于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),
      ),
    );
  }
}

注意:

  1. 在上面的代码中,我们使用了url_launcher插件来启动URL。你需要在pubspec.yaml中添加这个依赖:
dependencies:
  url_launcher: ^6.0.9  # 请检查最新版本号
  1. 确保你的应用有权限启动其他应用(即访问URL)。在Android上,这通常不需要额外的权限配置,但在iOS上,你可能需要在Info.plist中添加LSApplicationQueriesSchemes来指定可以启动的URL Scheme,例如comgooglemaps(尽管在上面的例子中我们直接使用了网页版的URL)。

  2. 由于直接使用URL Scheme可能无法在所有情况下都工作(例如,如果设备上未安装谷歌地图应用),因此建议在实际应用中添加适当的错误处理和用户提示。

这个示例展示了如何在Flutter应用中集成地图显示和基本的导航功能。如果你需要更复杂的功能,例如路线规划、实时导航等,你可能需要探索更高级的解决方案或自定义实现。

回到顶部