Flutter获取附近地图,定位特定地点

3,881 阅读4分钟

这是低版本的地图依赖,要特殊功能还请使用最新版的,这个仅供参考

这是低版本的地图依赖,要特殊功能还请使用最新版的,这个仅供参考

这是低版本的地图依赖,要特殊功能还请使用最新版的,这个仅供参考

依赖:

这样写没错的 地图+定位+权限

  amap_base_map: 0.4.4+1
  amap_location:
  permission_handler: ^3.0.0

参考:

blog.csdn.net/ivy_doudou/…

权限配置

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
    android:name="io.flutter.app.FlutterApplication"
    android:label="flutter_01"
    android:icon="@mipmap/ic_launcher">
    <meta-data
        android:name="com.amap.api.v2.apikey"
        android:value="高德地图的key"/>
</application>

pub.flutter-io.cn/packages/am…

blog.csdn.net/u014370269/…

javascript.ctolib.com/boomcx-amap…

安卓和ios的key不一样

main里的可能要改成 AMap.init('b905201aabd1c690b38135283bb69d62');

步骤:

1.amap_base_map存在错误,需要注释修改元代码。 map/android/src/main/kotlin/me/yohom/amapbasemap/map/MapHandlers.kt

object OpenOfflineManager : MapMethodHandler {

    override fun with(map: AMap): MapMethodHandler {
        return this
    }
    //报错代码注释
    override fun onMethodCall(methodCall: MethodCall, methodResult: MethodChannel.Result){
    }

    /*override fun onMethodCall(p0: MethodCall?, p1: MethodChannel.Result?) {
        registrar.activity().startActivity(
                Intent(AMapBaseMapPlugin.registrar.activity(),
                        OfflineMapActivity::class.java)
        )
    }*/
}

2.code

import 'package:flutter/material.dart';
import 'package:amap_base_map/amap_base_map.dart'; //高德地图amap_base_map
import 'package:amap_location/amap_location.dart';
import 'package:fluttertoast/fluttertoast.dart'; //提示框
import 'package:permission_handler/permission_handler.dart';

/**
 * ShowMapScreen
 * 地图缩放
 * 标注
 * 使用 ShowMapScreen(25.1298300890,113.377829),
 */

class ShowMapScreen extends StatefulWidget {
  @override
  _ShowMapScreenState createState() => _ShowMapScreenState();
}

class _ShowMapScreenState extends State<ShowMapScreen> {
  AMapController _controller;
  static double lat = 25.129830089063844;
  static double lng = 113.37782986111111;
  var lating =LatLng(lat,lng);//设置默认值防止意外

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

  @override
  void dispose() {
    _controller.dispose();
        AMapLocationClient.shutdown();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(
        builder: (context) {
//          Future.delayed(Duration(milliseconds: 1000));
          return Container(
              height: 300,
              child: Stack(
                children: <Widget>[
                  AMapView(
                    onAMapViewCreated: (controller) {
                      _controller = controller;
                      //插件代码报错,剪到本地git,有修改。
                _controller.mapClickedEvent.listen((it){
                  //处理点击事件
                  //清空标记
                  _controller.clearMarkers();
                  //标点
                  _controller.addMarker(MarkerOptions(
                    position: it,
                  ));
                });
                _controller.showMyLocation(true); //默认展示自己
              _controller.setMyLocationStyle(MyLocationStyle(
                    strokeWidth:0.0,
                    showMyLocation:true,//定位自己,上面就有用了,我不知道这个有啥用,但是还是加上了
                    myLocationType:5,//  定位、但不会移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动
                    interval:1000, //1s定位一次
                ));
                    },
                    amapOptions: AMapOptions(
                      zoomControlsEnabled:false,
                      compassEnabled: true, //指南针
//                      zoomControlsEnabled: true, //允许缩放
                      logoPosition: 2,//logo在地图右下角
                      camera: CameraPosition(
                        target: lating,
                        zoom: 18,
                      ),
                    ),
                  ),
                  Positioned(
                    top: 150,
                    right: 10,
                    child: InkWell(
                      onTap: () async {
                        //获取定位
                        var geting = await AMapLocationClient.getLocation(true);
                        setState(() {
                          lng = geting.longitude;
                          lat = geting.latitude;
                          lating = LatLng(lat, lng);
                        });
                        // 移动指定LatLng到中心
                        _controller.changeLatLng(lating);
                      },
                      child: Container(
                        alignment: Alignment.center,
                        height: 50,
                        width: 50,
                        color: Colors.indigoAccent,
                        child: Text('个人'),//跳到个人位置
                      ),
                    ),
                  ),
                ],
              ));
        },
      ),
    );
  }


  //是否开启权限
  void _getLocation() async {
    // 申请权限
    Map<PermissionGroup, PermissionStatus> permissions =
        await PermissionHandler()
            .requestPermissions([PermissionGroup.location]);
    // 申请结果
    PermissionStatus permission = await PermissionHandler()
        .checkPermissionStatus(PermissionGroup.location);
    if (permission == PermissionStatus.granted) {      //授权成功--》
      // 启动系统所需选项
      AMapLocationClient.startup(new AMapLocationOption(
          desiredAccuracy: CLLocationAccuracy.kCLLocationAccuracyHundredMeters));
        //获取当前位置
      var geting = await AMapLocationClient.getLocation(true);
      setState(() {
        lng = geting.longitude;
        lat = geting.latitude;
        lating = LatLng(lat, lng);
        _controller.changeLatLng(lating);
//      final nextLatLng = LatLng(lat, lng);

      });
      //定位改变监听
      AMapLocationClient.onLocationUpate.listen((AMapLocation loc){
//      print("$lng $lat");
        if(!mounted)return;
        setState(() {
          lng=loc.longitude;
          lat=loc.latitude;
          lating = LatLng(lat,lng);
        });
      });
      //启动监听位置改变
      AMapLocationClient.startLocation();
    } else {
      getFloat('请打开GPS和允许定位权限');
    }
  }

  //提示框
  getFloat(String text) {
    Fluttertoast.showToast(
        msg: text,
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.CENTER,
        timeInSecForIos: 2,
        fontSize: 16.0);
  }
}

使用 ShowMapScreen()

import 'package:flutter/material.dart';

import 'ShowMapScreen.dart';

class NewPage extends StatefulWidget {
  @override
  _NewPageState createState() => _NewPageState();
}

class _NewPageState extends State<NewPage> {
  @override
  Widget build(BuildContext context) {
    return Container(
        child: SingleChildScrollView(
      child:
          Column(mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[
        Container(
            width: MediaQuery.of(context).size.width,
            height: 200,
            child: ShowMapScreen()),
      ]),
    ));
  }
}

加入默认定位

import 'package:flutter/material.dart';
import 'package:amap_base_map/amap_base_map.dart'; //高德地图amap_base_map
import 'package:amap_location/amap_location.dart';
import 'package:fluttertoast/fluttertoast.dart'; //提示框
import 'package:permission_handler/permission_handler.dart';

/**
 * ShowMapScreen
 * 地图缩放
 * 标注
 * 使用 ShowMapScreen(25.1298300890,113.377829),
 */

class ShowMapScreen extends StatefulWidget {
  final lat;//经度 -
  final lng;//纬度
  ShowMapScreen([this.lat,this.lng]);
  @override
  _ShowMapScreenState createState() => _ShowMapScreenState();
}

class _ShowMapScreenState extends State<ShowMapScreen> {
  AMapController _controller;
  static double lat = 25.129830089063844;
  static double lng = 113.37782986111111;
  var lating =LatLng(lat,lng);
  var nating = LatLng(28.1298,113.3778);//老人位置

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

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(
        builder: (context) {
//          Future.delayed(Duration(milliseconds: 1000));
          return Container(
              height: 300,
              child: Stack(
                children: <Widget>[
                  AMapView(
                    onAMapViewCreated: (controller) {
                      _controller = controller;
                      //插件代码报错,剪到本地git,有修改。
                _controller.mapClickedEvent.listen((it){
                  //处理点击事件
                  //清空标记
                  _controller.clearMarkers();
                  //标点
                  _controller.addMarker(MarkerOptions(
                    position: it,
                  ));
                });
                _controller.showMyLocation(true); //默认展示自己
              _controller.setMyLocationStyle(MyLocationStyle(
                    strokeWidth:0.0,
                    showMyLocation:true,//定位自己,上面就有用了,我不知道这个有啥用,但是还是加上了
                    myLocationType:5,//  定位、但不会移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动
                    interval:1000, //1s定位一次
                ));
                    },
                    amapOptions: AMapOptions(
                      zoomControlsEnabled:false,
                      compassEnabled: true, //指南针
//                      zoomControlsEnabled: true, //允许缩放
                      logoPosition: 2,//logo在地图右下角
                      camera: CameraPosition(
                        target: lating,
                        zoom: 18,
                      ),
                    ),
                  ),
                  Positioned(
                    top: 150,
                    right: 10,
                    child: InkWell(
                      onTap: () async {
                        //获取定位
                        var geting = await AMapLocationClient.getLocation(true);
                        setState(() {
                          lng = geting.longitude;
                          lat = geting.latitude;
                          lating = LatLng(lat, lng);
                        });
                        // 移动指定LatLng到中心
                        _controller.changeLatLng(lating);
                      },
                      child: Container(
                        alignment: Alignment.center,
                        height: 50,
                        width: 50,
                        color: Colors.indigoAccent,
                        child: Text('个人'),
                      ),
                    ),
                  ),
                  Positioned(
                    top: 100,
                    right: 10,
                    child: InkWell(
                      onTap: ()  {
                        // 移动指定LatLng到中心
                        _controller.changeLatLng(nating);
                        _controller.addMarker(MarkerOptions(
                          position: nating,
                        ));
                      },
                      child: Container(
                        alignment: Alignment.center,
                        height: 50,
                        width: 50,
                        decoration: BoxDecoration(
                            color: Colors.indigoAccent,
                            border: Border(bottom:BorderSide(
                                width: 1,color: Color(0xff000)
                            ))
                        ),

//                        child: Icon(Icons.add),
                        child: Text('宿主'),
                      ),
                    ),
                  ),
                ],
              ));
        },
      ),
    );
  }


  //定位标记
  _getLocation() async {
    checkPersmission();
  }

  //是否开启权限
  void checkPersmission() async {
    // 申请权限
    Map<PermissionGroup, PermissionStatus> permissions =
        await PermissionHandler()
            .requestPermissions([PermissionGroup.location]);
    // 申请结果
    PermissionStatus permission = await PermissionHandler()
        .checkPermissionStatus(PermissionGroup.location);
    if (permission == PermissionStatus.granted) {      //授权成功--》
      // 启动系统所需选项
      AMapLocationClient.startup(new AMapLocationOption(
          desiredAccuracy: CLLocationAccuracy.kCLLocationAccuracyHundredMeters));
      //如果有传入经纬度
      if(widget.lat!=null){
        nating = LatLng(widget.lat??28.1298,widget.lng??113.3778);//老人位置
        _controller.changeLatLng(nating);
        _controller.addMarker(MarkerOptions(
          position: nating,
        ));
      }else{
        //获取当前位置
      var geting = await AMapLocationClient.getLocation(true);
      setState(() {
        lng = geting.longitude;
        lat = geting.latitude;
        lating = LatLng(lat, lng);
        _controller.changeLatLng(lating);
//      final nextLatLng = LatLng(lat, lng);
      });
      //定位改变监听
      AMapLocationClient.onLocationUpate.listen((AMapLocation loc){
//      print("$lng $lat");
        if(!mounted)return;
        setState(() {
          lng=loc.longitude;
          lat=loc.latitude;
          lating = LatLng(lat,lng);
        });
      });
      //启动监听位置改变
      AMapLocationClient.startLocation();
      }
    } else {
      getFloat('请打开GPS和允许定位权限');
    }
  }

  //提示框
  getFloat(String text) {
    Fluttertoast.showToast(
        msg: text,
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.CENTER,
        timeInSecForIos: 2,
        fontSize: 16.0);
  }
}