Flutter地图服务插件flutter_dhl_amap的使用

Flutter地图服务插件flutter_dhl_amap的使用

开始使用

flutter_dhl_amap 是一个用于在 Flutter 应用中集成高德地图服务的插件。通过该插件,开发者可以轻松实现地图显示、定位、标注等功能。

初始化插件

首先,确保在 main() 函数中正确初始化插件并设置高德地图的 API Key。API Key 是调用高德地图服务的必要凭证。

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  var _result = "";
  var m_key = 0;
  late DHL_aMapView dhl_aMapView;

  [@override](/user/override)
  void initState() {
    super.initState();

    initPlatformState();
    new FlutterDhlAmap();
    FlutterDhlAmap.setInit("5a7ad9d014cfe8083741e895cfc15ee2"); // 初始化插件并设置高德地图 API Key

    FlutterDhlAmap.startLocation(DHL_AMapLocationOption( // 设置定位参数
      interval: 10000,
      onceLocationLatest: true,
      locationCacheEnable: false,
      allowsBackgroundLocationUpdates: true,
      locationTimeout: 2,
      reGeocodeTimeout: 2,
    )); // 开始定位

    FlutterDhlAmap.onLocationUpate.listen((DHL_Location_Model data) {
      if (!mounted) return;
      print(data.formattedAddress);
      dhl_aMapView.SetCoordinate(data.lat, data.lon); // 定位成功后设置地图中心
      dhl_aMapView.SetMymarkerContent(data.lat.toString(), data.lon.toString());

      setState(() {
        m_key++;
        _result = data.formattedAddress;
      });
    });

    FlutterDhlAmap.onLocationUpate_Measure.listen((List<DHL_Measure_Model> data) { // 计算两个坐标的回调
      List<DHL_Measure_Model> dat = data;
    });

    initPlatformState();
  }

  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = await FlutterDhlAmap.platformVersion;
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }
}

配置地图视图

build() 方法中配置地图视图,并添加必要的功能按钮。

[@override](/user/override)
Widget build(BuildContext context) {
  dhl_aMapView = DHL_aMapView(dhlAMapViewModel: DHL_aMapView_Model(
    setZoomControlsEnabled: true,
    setCompassEnabled: true,
    setMyLocationButtonEnabled: true,
    setScaleControlsEnabled: true,
    setZoomGesturesEnabled: true,
  ));

  return MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Row(
          children: <Widget>[
            RaisedButton(
              onPressed: () async {
                dhl_aMapView.AddMarker(22.160258, 113.347154, "标题", "内容", "0", true); // 添加标注
                dhl_aMapView.UpdateMarker(22.160257, 113.347154, "更新到了", "更新到了", "0"); // 更新标注
                FlutterDhlAmap.Calculation_location(22.160258, 113.347154, 23.697839, 113.0441, 1); // 计算两点距离

                // Map<dynamic, dynamic> dmap = await FlutterDhlAmap.changeLocation(22.160258, 113.347154, "baidu"); // 转换坐标
              },
              child: Text('Plugin example app:'),
            ),

            RaisedButton(
              onPressed: () {
                dhl_aMapView.DelMarkerShow("0"); // 删除所有标注
              },
              child: Text('22222'),
            ),
          ],
        ),
      ),
      body: Center(
        child: dhl_aMapView,
      ),
    ),
  );
}

功能说明

  • 定位功能:通过 startLocation 方法启动定位,并监听定位更新事件。
  • 添加标注:使用 AddMarker 方法在地图上添加标注。
  • 更新标注:使用 UpdateMarker 方法更新已有的标注。
  • 删除标注:使用 DelMarkerShow 方法删除所有标注。
  • 计算距离:使用 Calculation_location 方法计算两个坐标之间的距离。

完整示例代码

以下是完整的示例代码:

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

import 'package:flutter/services.dart';
import 'package:flutter_dhl_amap/DHL_Location.dart';
import 'package:flutter_dhl_amap/DHL_Location_Model.dart';
import 'package:flutter_dhl_amap/Search/DHL_Measure_Model.dart';
import 'package:flutter_dhl_amap/aMap/DHL_aMapView.dart';
import 'package:flutter_dhl_amap/aMap/DHL_aMapView_Model.dart';
import 'package:flutter_dhl_amap/flutter_dhl_amap.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  var _result = "";
  var m_key = 0;
  late DHL_aMapView dhl_aMapView;

  [@override](/user/override)
  void initState() {
    super.initState();

    initPlatformState();
    new FlutterDhlAmap();
    FlutterDhlAmap.setInit("5a7ad9d014cfe8083741e895cfc15ee2"); // 初始化插件并设置高德地图 API Key

    FlutterDhlAmap.startLocation(DHL_AMapLocationOption( // 设置定位参数
      interval: 10000,
      onceLocationLatest: true,
      locationCacheEnable: false,
      allowsBackgroundLocationUpdates: true,
      locationTimeout: 2,
      reGeocodeTimeout: 2,
    )); // 开始定位

    FlutterDhlAmap.onLocationUpate.listen((DHL_Location_Model data) {
      if (!mounted) return;
      print(data.formattedAddress);
      dhl_aMapView.SetCoordinate(data.lat, data.lon); // 定位成功后设置地图中心
      dhl_aMapView.SetMymarkerContent(data.lat.toString(), data.lon.toString());

      setState(() {
        m_key++;
        _result = data.formattedAddress;
      });
    });

    FlutterDhlAmap.onLocationUpate_Measure.listen((List<DHL_Measure_Model> data) { // 计算两个坐标的回调
      List<DHL_Measure_Model> dat = data;
    });

    initPlatformState();
  }

  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = await FlutterDhlAmap.platformVersion;
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    dhl_aMapView = DHL_aMapView(dhlAMapViewModel: DHL_aMapView_Model(
      setZoomControlsEnabled: true,
      setCompassEnabled: true,
      setMyLocationButtonEnabled: true,
      setScaleControlsEnabled: true,
      setZoomGesturesEnabled: true,
    ));

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Row(
            children: <Widget>[
              RaisedButton(
                onPressed: () async {
                  dhl_aMapView.AddMarker(22.160258, 113.347154, "标题", "内容", "0", true); // 添加标注
                  dhl_aMapView.UpdateMarker(22.160257, 113.347154, "更新到了", "更新到了", "0"); // 更新标注
                  FlutterDhlAmap.Calculation_location(22.160258, 113.347154, 23.697839, 113.0441, 1); // 计算两点距离

                  // Map<dynamic, dynamic> dmap = await FlutterDhlAmap.changeLocation(22.160258, 113.347154, "baidu"); // 转换坐标
                },
                child: Text('Plugin example app:'),
              ),

              RaisedButton(
                onPressed: () {
                  dhl_aMapView.DelMarkerShow("0"); // 删除所有标注
                },
                child: Text('22222'),
              ),
            ],
          ),
        ),
        body: Center(
          child: dhl_aMapView,
        ),
      ),
    );
  }
}

更多关于Flutter地图服务插件flutter_dhl_amap的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图服务插件flutter_dhl_amap的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_dhl_amap 是一个基于高德地图(AMap)的 Flutter 插件,用于在 Flutter 应用中集成高德地图的功能。以下是如何使用 flutter_dhl_amap 的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_dhl_amap 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_dhl_amap: ^版本号

替换 ^版本号 为最新的版本号。

2. 配置 Android 和 iOS 平台

Android

android/app/src/main/AndroidManifest.xml 文件中添加高德地图的 API Key 和必要的权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <application
        android:label="Your App Name"
        android:icon="@mipmap/ic_launcher">

        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="您的API_KEY" />

    </application>
</manifest>

iOS

ios/Runner/Info.plist 文件中添加高德地图的 API Key 和必要的权限:

<dict>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>需要访问您的位置以提供定位服务</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>需要访问您的位置以提供定位服务</string>

    <key>AMapServices</key>
    <dict>
        <key>APIKey</key>
        <string>您的API_KEY</string>
    </dict>
</dict>

3. 初始化插件

main.dart 文件中初始化 flutter_dhl_amap

import 'package:flutter_dhl_amap/flutter_dhl_amap.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AMap.init('您的API_KEY');
  runApp(MyApp());
}

4. 使用地图组件

在应用的某个页面中使用 AMap 组件:

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

class MapScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('高德地图'),
      ),
      body: AMap(
        initialCameraPosition: CameraPosition(
          target: LatLng(39.909, 116.397),
          zoom: 15,
        ),
        markers: <Marker>[
          Marker(
            position: LatLng(39.909, 116.397),
            icon: BitmapDescriptor.defaultMarker,
            infoWindow: InfoWindow(title: '北京', snippet: '中国首都'),
          ),
        ],
        onMapCreated: (AMapController controller) {
          // 地图创建完成后的回调
        },
      ),
    );
  }
}

5. 处理权限

确保在应用中处理位置权限请求。可以使用 permission_handler 插件来处理权限请求。

import 'package:permission_handler/permission_handler.dart';

Future<void> requestLocationPermission() async {
  var status = await Permission.location.status;
  if (!status.isGranted) {
    await Permission.location.request();
  }
}

6. 其他功能

flutter_dhl_amap 还提供了其他功能,如定位、地理编码、路径规划等。你可以根据需要使用这些功能。

// 获取当前位置
var location = await AMap.getLocation();
print(location);

// 地理编码
var geocode = await AMap.geocode('北京市朝阳区');
print(geocode);

// 路径规划
var route = await AMap.driveRoute(
  origin: LatLng(39.909, 116.397),
  destination: LatLng(39.904, 116.407),
);
print(route);
回到顶部