Flutter谷歌导航插件google_navigation_flutter的使用

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

Flutter谷歌导航插件google_navigation_flutter的使用

描述

此仓库包含一个Flutter插件,它为面向Android和iOS的应用程序提供了一个Google Navigation小部件。

注意

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

要求

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

重要

  • 对API密钥应用API限制,仅限于“Navigation SDK”、“Maps SDK for Android”和“Maps SDK for iOS”,以增强安全性和成本管理。这有助于防止未经授权使用您的API密钥。

安装

  1. 使用以下命令将Google Navigation for Flutter包添加到您的项目:

    flutter pub add google_navigation_flutter
    
  2. 设置目标平台的最小平台版本。

    • Androidandroid/app/build.gradle中设置minSdkVersion
      android {
          defaultConfig {
              minSdkVersion 23
          }
      }
      
    • iOS
      1. 在您首选的IDE中打开ios/Podfile配置文件。
      2. 将以下行添加到Podfile的开头:
      # Set platform to 15.0 to enable latest Google Maps SDK
      platform :ios, '15.0'
      
  3. 使用这些说明将API密钥添加到Flutter项目的相应Android(build.gradle)和iOS(AppDelegate.swift)文件中。

使用

您可以现在在小部件树中添加一个GoogleMapsNavigationView小部件。

视图可以通过传递给onViewCreated回调的GoogleNavigationViewController进行控制。

GoogleMapsNavigationView小部件应在一个具有限定大小的小部件内使用。如果在未限定大小的小部件中使用,应用程序将抛出Flutter异常。

您还可以添加一个裸GoogleMapsMapView,它作为普通地图视图工作,但没有导航功能。

添加导航视图

import 'package:flutter/material.dart';
import 'package:google_navigation_flutter/google_navigation_flutter.dart';

class NavigationSample extends StatefulWidget {
  const NavigationSample({super.key});

  @override
  State<NavigationSample> createState() => _NavigationSampleState();
}

class _NavigationSampleState extends State<NavigationSample> {
  GoogleNavigationViewController? _navigationViewController;
  bool _navigationSessionInitialized = false;

  @override
  void initState() {
    super.initState();
    _initializeNavigationSession();
  }

  Future<void> _initializeNavigationSession() async {
    if (!await GoogleMapsNavigator.areTermsAccepted()) {
      await GoogleMapsNavigator.showTermsAndConditionsDialog(
        'Example title',
        'Example company',
      );
    }
    // 确保用户已授予位置权限后才开始导航会话。
    await GoogleMapsNavigator.initializeNavigationSession();
    setState(() {
      _navigationSessionInitialized = true;
    });
  }

  @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
  void dispose() {
    if (_navigationSessionInitialized) {
      GoogleMapsNavigator.cleanup();
    }
    super.dispose();
  }
}

添加地图视图

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text('Google Maps Navigation Sample')),
    body: _navigationSessionInitialized
        ? GoogleMapsMapView(
            onViewCreated: _onViewCreated,
            initialCameraPosition: CameraPosition(
              // 初始化地图到用户位置。
              target: _userLocation!,
              zoom: 15,
            ),
            // 其他视图初始化设置
          )
        : const Center(child: CircularProgressIndicator()),
  );
}

请求和处理权限

Google Navigation SDK Flutter插件提供了需要特定移动操作系统权限的功能。这些包括但不限于位置服务、后台执行和接收后台位置更新。

示例代码:请求位置权限

PermissionStatus _locationPermissionStatus = PermissionStatus.denied;

// ...

/// 请求访问设备位置的权限。
///
/// Android:精细和粗略定位
/// iOS:CoreLocation(始终和使用时)
Future<void> _requestLocationPermission() async {
  final PermissionStatus status = await Permission.location.request();

  setState(() {
    _locationPermissionStatus = status;
  });
}

// ...

@override
Widget build(BuildContext context) {
  _requestLocationPermission();
  ...
}

完整的示例可以在这里找到。

贡献

请参阅贡献指南

支持

此软件包通过开源许可证提供。它不受Google Maps Platform支持技术支援服务指南SLA弃用政策的约束(但是,库使用的任何Google Maps Platform服务仍然受Google Maps Platform条款和服务的约束)。

如果您发现错误或有功能请求,请在GitHub上提交问题。如果您想从其他Google Maps Platform开发人员那里获得技术问题的答案,请通过我们的开发人员社区渠道之一提问。如果您想做出贡献,请查看贡献指南


更多关于Flutter谷歌导航插件google_navigation_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter谷歌导航插件google_navigation_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用google_navigation_flutter插件的示例代码。这个插件允许你在Flutter应用中集成Google Maps导航功能。

首先,确保你已经在pubspec.yaml文件中添加了google_navigation_flutter依赖项:

dependencies:
  flutter:
    sdk: flutter
  google_navigation_flutter: ^x.y.z  # 替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用google_navigation_flutter插件:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:google_navigation_flutter/google_navigation_flutter.dart';
  1. 初始化Google Maps API密钥

确保你已经有一个有效的Google Maps API密钥,并在你的Android和iOS项目中进行了配置。

  1. 创建导航按钮并调用导航功能

在你的Flutter应用中,你可以创建一个按钮,当用户点击该按钮时,将启动Google Maps导航。

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Google Navigation Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 定义起点和终点
  final String startLocation = "37.7749,-122.4194"; // 旧金山
  final String endLocation = "34.0522,-118.2437";   // 洛杉矶

  void navigateToLocation() async {
    try {
      // 调用Google导航插件
      await GoogleNavigation.startNavigation(
        context: context,
        apiKey: "YOUR_GOOGLE_MAPS_API_KEY", // 替换为你的API密钥
        origin: startLocation,
        destination: endLocation,
        travelMode: TravelMode.driving, // 你可以选择其他模式,如bicycling, transit, walking
      );
    } catch (e) {
      print("Error navigating: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Navigation Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: navigateToLocation,
          child: Text('Navigate to Los Angeles'),
        ),
      ),
    );
  }
}

在这个示例中,当用户点击按钮时,navigateToLocation函数会被调用,该函数使用GoogleNavigation.startNavigation方法启动Google Maps导航应用,并导航从旧金山到洛杉矶。

注意事项

  • 确保你已经在Google Cloud Platform上启用了Maps SDK for Android和iOS,并创建了相应的API密钥。
  • 在Android和iOS项目中正确配置了API密钥。
  • 考虑到隐私和安全性,不要将API密钥硬编码在客户端代码中。你可以考虑使用环境变量或后端服务来管理API密钥。

希望这个示例能帮助你在Flutter项目中成功集成Google导航功能!

回到顶部