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

依赖:
这样写没错的 地图+定位+权限
amap_base_map: 0.4.4+1
amap_location:
permission_handler: ^3.0.0
参考:
权限配置
<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…
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);
}
}