flutter 高德地图选择位置信息返回
添加依赖:(注意,作者一直更新维护,请以最新的版本添加)
amap_map_fluttify: ^0.10.
amap_search_fluttify: ^0.3.
/// !!使用真机调试!!
/// !注意: 只要是返回Future的方法, 一律使用`await`修饰, 确保当前方法执行完成后再执行下一行, 在不能使用`await`修饰的环境下, 在`then`方法中执行下一步.
///
/// Swift工程需要注释掉Podfile中的`use_frameworks!`
/// 初始化:
/// 1. iOS在init方法中设置
/// 2. Android需要在AndroidManifest.xml里去设置, 详见 https://lbs.amap.com/api/android-sdk/gettingstarted
/// <application>
/// <meta-data
/// android:name="com.amap.api.v2.apikey"
/// android:value="您的Key"/>
/// </application>
await AmapCore.init('key');
/// 如果你觉得引擎的日志太多, 可以关闭Fluttify引擎的日志
await enableFluttifyLog(false); // 关闭log
代码实现:
import 'package:amap_map_fluttify/amap_map_fluttify.dart'; import 'package:flutter/material.dart';
import 'package:amap_search_fluttify/amap_search_fluttify.dart';
import 'package:demo/resources/custom_text_style.dart';
import 'package:demo/utils/misc.dart'; import 'package:demo/widgets/network_state/page_loading.dart'; class SelectLocationFromMapPage extends StatefulWidget {
@override
_SelectLocationFromMapPageState createState() =>
_SelectLocationFromMapPageState();
} class _SelectLocationFromMapPageState extends State<SelectLocationFromMapPage> {
AmapController _controller;
List<Poi> poiList;
static List<PoiModel> list = new List();
static List<PoiModel> searchlist = new List();
PoiModel poiModel;
String keyword = "";
String address = "";
bool isloading = true; @override
void initState() {
super.initState();
} @override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomPadding: false, //防止底部布局被顶起
appBar: AppBar(
title: Text(
'选择位置信息',
style: CustomTextStyle.appBarTitleTextStyle,
),
elevation: 0.0,
centerTitle: true,
), body: Column(
children: <Widget>[
Theme(
data: new ThemeData(
primaryColor: Color(0xFFFFCA28), hintColor: Color(0xFFFFCA28)),
child: Container(
color: Color(0xFFFFCA28),
padding: EdgeInsets.all(5),
child: Container(
height: 36,
margin: EdgeInsets.only(left: 5, right: 5, bottom: 5),
child: TextField(
style: TextStyle(fontSize: 16, letterSpacing: 1.0),
controller: TextEditingController.fromValue(TextEditingValue(
// 设置内容
text: keyword,
selection: TextSelection.fromPosition(TextPosition(
affinity: TextAffinity.downstream,
offset: keyword?.length ?? 0)),
// 保持光标在最后
)),
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(40)),
),
hintText: '输入关键字',
hintStyle:
TextStyle(color: Color(0xFFBEBEBE), fontSize: 14),
contentPadding:
const EdgeInsets.symmetric(vertical: 8, horizontal: 1),
prefixIcon: Icon(
Icons.search,
color: Colors.grey,
size: 20,
),
suffixIcon: IconButton(
icon: Icon(
Icons.clear,
color: Colors.grey,
size: 20,
),
onPressed: () {
keyword = "";
setState(() {});
},
),
fillColor: Colors.white,
filled: true,
), inputFormatters: [],
//内容改变的回调
onChanged: (text) {
print('change $text');
keyword = text;
},
//内容提交(按回车)的回调
onSubmitted: (text) {
print('submit $text');
// 触发关闭弹出来的键盘。
keyword = text;
setState(() {
isloading = true;
FocusScope.of(context).requestFocus(FocusNode());
}); searchAroundAddress(text.toString());
},
//按回车时调用
onEditingComplete: () {
print('onEditingComplete');
},
),
),
),
),
Container(
height: 300,
child: Stack(
children: <Widget>[
AmapView(
showZoomControl: false,
centerCoordinate: LatLng(39, 110),
maskDelay: Duration(milliseconds: 500),
zoomLevel: 16,
onMapCreated: (controller) async {
_controller = controller;
if (await requestPermission()) {
await controller.showMyLocation(true);
await controller?.showLocateControl(true);
final latLng = await _controller?.getLocation(
delay: Duration(seconds: 2));
await enableFluttifyLog(false); // 关闭log
_loadData(latLng);
}
},
onMapMoveEnd: (MapMove move) async {
_loadData(move.latLng);
},
),
Center(
child: Icon(
Icons.place,
size: 36.0,
color: Color(0xFFFF0000),
),
),
],
),
),
Expanded(
flex: 1,
child: Visibility(
visible: !isloading,
maintainSize: false,
maintainSemantics: false,
maintainInteractivity: false,
replacement: PageLoading(),
child: ListView.builder(
itemCount: list.length,
itemBuilder: (BuildContext context, int position) {
print("itemBuilder" + list.length.toString());
PoiModel item = list[position];
return InkWell(
child: Column(
children: <Widget>[
Container(
margin:
EdgeInsets.only(top: 8, bottom: 5, left: 10),
child: Row(
children: <Widget>[
Icon(
Icons.place,
size: 20.0,
color: position == 0
? Colors.green
: Colors.grey,
),
Text(item.title,
style: TextStyle(
fontSize: 16,
color: position == 0
? Colors.green
: Color(0xFF787878)))
],
),
),
Container(
margin:
EdgeInsets.only(top: 5, bottom: 5, left: 18),
alignment: Alignment.centerLeft,
child: Text(
item.address,
style: TextStyle(
fontSize: 14,
color: Color(0xFF646464),
),
),
),
Divider(
height: 1,
)
],
),
onTap: () async {
await _controller.setCenterCoordinate(
item.latLng.latitude, item.latLng.longitude,
zoomLevel: 16);
Navigator.pop(context, {
'address': item.address,
});
},
);
}),
),
),
],
),
);
} void _loadData(LatLng latLng) async {
setState(() {
isloading = true;
}); /// 逆地理编码(坐标转地址)
ReGeocode reGeocodeList = await AmapSearch.searchReGeocode(
latLng,
); print(await reGeocodeList.toFutureString());
address = await reGeocodeList.formatAddress; final poiList = await AmapSearch.searchKeyword(
address.toString(),
city: "西安",
); poiModel = new PoiModel("当前位置", address, latLng);
list.clear();
list.add(poiModel);
for (var poi in poiList) {
String title = await poi.title;
String cityName = await poi.cityName;
String provinceName = await poi.provinceName;
String address = await poi.address;
LatLng latLng = await poi.latLng; list.add(new PoiModel(
title.toString(),
provinceName.toString() + cityName.toString() + address.toString(),
latLng));
} setState(() {
isloading = false;
});
} void searchAroundAddress(String text) async {
final poiList = await AmapSearch.searchKeyword(
text,
city: "西安",
); list.clear();
list.add(poiModel);
for (var poi in poiList) {
String title = await poi.title;
LatLng latLng = await poi.latLng;
String cityName = await poi.cityName;
String provinceName = await poi.provinceName;
String address = await poi.address;
list.add(new PoiModel(
title.toString(),
provinceName.toString() + cityName.toString() + address.toString(),
latLng));
}
setState(() {
isloading = false;
FocusScope.of(context).requestFocus(FocusNode());
});
}
} class PoiModel {
LatLng latLng;
String title;
String address; PoiModel(this.title, this.address, this.latLng);
}
misc.dart
import 'package:permission_handler/permission_handler.dart';
Future<bool> requestPermission() async {
final permissions =
await PermissionHandler().requestPermissions([PermissionGroup.location]);
if (permissions[PermissionGroup.location] == PermissionStatus.granted) {
return true;
} else {
ToastUtils.toastLong("需要定位权限!");
return false;
}
}
pageloading.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; class PageLoading extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
CupertinoActivityIndicator(),
// Text(' 正在加载', style: TextStyle(fontSize: 16.0),),
],
),
);
}
}
效果:

flutter 高德地图选择位置信息返回的更多相关文章
- 微信小程序调用地图选取位置后返回信息
先看一下wxml的代码,绑定个事件! <view class='carpool_data_all'> <view class='aa'> <text>*出发地< ...
- 微信小程序打开地图选择位置
wx.getLocation({ type: 'wgs84', success(res) { const latitude = res.latitude const longitude = res.l ...
- 根据关键字获取高德地图poi信息
根据关键字获取高德地图poi信息 百度地图和高德地图都提供了根据关键字获取相应的poi信息的api,不过它们提供给普通开发者使用的次数有限无法满足要求.其次百度地图返回的poi中位置信息不是经纬度,而 ...
- 高德地图首席科学家任小枫QA答疑汇总丨视觉+地图技术有哪些新玩法?
上周,阿里巴巴高德地图首席科学家任小枫在#大咖学长云对话#的在线直播活动上就计算机视觉相关技术发展以及在地图出行领域的应用与大家做技术交流,直播间互动火爆,尤其在QA环节,学弟学妹们纷纷就感兴趣的视觉 ...
- web开发如何使用高德地图API(三)点击热点打开信息窗体
说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...
- 高德地图搜索提示获取信息回传activity刷新ui(二)
应用场景: 在主activity中点击进入到另一个activity搜索提示,获取经纬度,点确定返回到主activity,虽然说需求很奇葩,但是遇到了没办法.. 主要包含两部分,搜索提示+activit ...
- H5高德地图获取当前位置
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...
- QQ发送位置(高德地图)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- 使用高德地图JS获取当前位置和经纬度
先看效果,我做的是这样的,可以按地图位置来返回当前你点的位置(图一,二),也可以根据输入框的自动搜索(图三,四) HTML的代码: <div> <input type="t ...
随机推荐
- Codeforces H. Prime Gift(折半枚举二分)
题目描述: Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes input standard ...
- springboot之DevTools热部署的简单原理解析
IDEA新建springboot选择DevTools springboot-devtools模块能够实现热部署,添加类.添加方法,修改配置文件,修改页面等,都能实现热部署. 原理就是重启项目,但比手动 ...
- 后端将Long类型数据传输到前端出现精度丢失的问题
当将超过16位的数字传输到前端的时候,就会出现精度丢失的问题,然后我按照网上的几种方法实验的时候,只有一种方法成功了.可能是因为环境等方面的问题. 我这里成功是因为:最后使用的是配置mvc的方式,然后 ...
- Linux-导入已安装的Linux系统
之前在安装过一个Linux系统,由于重装电脑需要将之前安装的系统重新移动到VMWare中,让Linux系统能够重新运行起来,这样也省去了每次重新安装系统的麻烦. 废话不多说,咱们直接看是如何做? 1) ...
- spring security 学习资料
spring security 学习资料 网址 Spring Security 文档参考手册中文版 https://springcloud.cc/spring-security.html
- 使用Postman做接口测试
Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果, 从而验证响应中的结果数据是否和 ...
- 记录:http协议+response+request+session+cookie
1.http协议 http协议也叫作超文本传输协议,定义了浏览器向怎样向服务器请求资源和服务器怎样将资源传给浏览器.http协议是面向事务的应用层协议,是万维网能够传递资源的可靠保障. 目前http协 ...
- scala 学习笔记--模式匹配
1.switch java代码 switch (cause) { case ‘2‘ : dropTime=time; case ‘8’:case ‘9’ : case ‘10’:case ‘11’ : ...
- 洛谷 CF1153B Serval and Toy Bricks
目录 题目 思路 \(Code\) 题目 CF1153B Serval and Toy Bricks 思路 自己也很懵的一道题(不知道自己怎么就对了)...只要对于所给的俯视图上值为\(1\)的位置输 ...
- uni-app 事件以及事件绑定
事件修饰符stop的使用会阻止冒泡,但是同时绑定了一个非冒泡的事件,会导致该元素上的catchEventName失效! prevent可以直接干掉,因为uni-app里没有什么默认事件,比如submi ...