Flutter地图导航插件navigation_with_mapbox的使用

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

Flutter地图导航插件 navigation_with_mapbox 的使用

navigation_with_mapbox 是一个用于在Flutter应用中添加逐向导航功能的插件,它基于MapBox服务。以下是详细的配置和示例代码。

配置指南

Android 配置

  1. 获取并设置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>
    
  2. 添加权限:在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>
    
  3. 下载Mapbox二进制文件所需的令牌:将具有downloads:read作用域的MapBox下载令牌添加到你的gradle.properties文件中。

    MAPBOX_DOWNLOADS_TOKEN=sk.xxxxx
    

iOS 配置

  1. 创建并设置下载令牌:在.netrc文件中添加具有DOWNLOADS:READ作用域的Mapbox API令牌。

  2. 设置Mapbox访问令牌:在Info.plist中设置MBXAccessToken为你的访问令牌。

  3. 设置位置使用描述:设置NSLocationWhenInUseUsageDescription以说明应用为何需要访问用户的位置信息。

  4. 后台模式:启用“音频、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

1 回复

更多关于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插件的基本功能,但你可以根据需要进一步自定义和扩展它。

回到顶部