一、说明
我们在应用开发中经常需要用到地图定位或导航的功能,而集成该功能的方式总的来说分为两类:

第 1 类:App 集成导航功能

这种方式的优点是可以进行深度地图定制,比如出行或外卖软件会有自己的定制,上面会有司机或骑手的小图标,但是集成开发成本也是比较高的。

第 2 类:跳转第三方地图软件

这种方式是比较简单的一种,把目的地传给第三方导航软件,比如百度地图,它会为你提供导航功能。这种方式开发成本低,可快速提供导航功能。
由于 Flutter 技术出来不久,普及率算不上很高,目前很多导航定位还未对其提供专门支持,如果想集成导航功能的话,开发成本非常高,所以我们会考虑用跳转三方地图软件的方式实现导航功能。

二、实现步骤

第 1 步:添加插件

在 pubspec.yaml 文件中添加依赖插件:

  1. url_launcher: ^5.4.2

第 2 步:iOS 配置 info.plist

  1. 1. <key>LSApplicationQueriesSchemes</key>
  2. 2. <array>
  3. 3. <string>iosamap</string>
  4. 4. <string>qqmap</string>
  5. 5. <string>baidumap</string>
  6. 6. </array>

第 3 步:跳转导航

  1. class MapUtil {
  2. /// 高德地图
  3. static Future<bool> gotoAMap(longitude, latitude) async {
  4. var url = '${Platform.isAndroid ? 'android' : 'ios'}amap://navi?sourceApplication=amap&lat=$latitude&lon=$longitude&dev=0&style=2';
  5. bool canLaunchUrl = await canLaunch(url);
  6. if (!canLaunchUrl) {
  7. ToastUtil.show('未检测到高德地图~');
  8. return false;
  9. }
  10. await launch(url);
  11. return true;
  12. }
  13. /// 腾讯地图
  14. static Future<bool> gotoTencentMap(longitude, latitude) async {
  15. var url = 'qqmap://map/routeplan?type=drive&fromcoord=CurrentLocation&tocoord=$latitude,$longitude&referer=IXHBZ-QIZE4-ZQ6UP-DJYEO-HC2K2-EZBXJ';
  16. bool canLaunchUrl = await canLaunch(url);
  17. if (!canLaunchUrl) {
  18. ToastUtil.show('未检测到腾讯地图~');
  19. return false;
  20. }
  21. await launch(url);
  22. return canLaunchUrl;
  23. }
  24. /// 百度地图
  25. static Future<bool> gotoBaiduMap(longitude, latitude) async {
  26. var url = 'baidumap://map/direction?destination=$latitude,$longitude&coord_type=bd09ll&mode=driving';
  27. bool canLaunchUrl = await canLaunch(url);
  28. if (!canLaunchUrl) {
  29. ToastUtil.show('未检测到百度地图~');
  30. return false;
  31. }
  32. await launch(url);
  33. return canLaunchUrl;
  34. }
  35. /// 苹果地图
  36. static Future<bool> _gotoAppleMap(longitude, latitude) async {
  37. var url = 'http://maps.apple.com/?&daddr=$latitude,$longitude';
  38. bool canLaunchUrl = await canLaunch(url);
  39. if (!canLaunchUrl) {
  40. ToastUtil.show('打开失败~');
  41. return false;
  42. }
  43. await launch(url);
  44. }
  45. }

以上是我封装的一个工具类,基本上可以拿来直接用,其中 toast 是我自己封装的,你们可以去掉这部分代码,然后用你们自己的方式通知用户打开失败。

三、注意

  1. 添加依赖库后不要忘记点击:Packages get。
  2. 要停止应用后重新运行安装到手机,添加三方库后只用 hot reload 是无法生效的。

    四、参考

  3. 高德地图官方文档

  4. 腾讯地图官方文档
  5. 百度地图官方文档
  6. 苹果地图官方文档