添加依赖:(注意,作者一直更新维护,请以最新的版本添加)

  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 高德地图选择位置信息返回的更多相关文章

  1. 微信小程序调用地图选取位置后返回信息

    先看一下wxml的代码,绑定个事件! <view class='carpool_data_all'> <view class='aa'> <text>*出发地< ...

  2. 微信小程序打开地图选择位置

    wx.getLocation({ type: 'wgs84', success(res) { const latitude = res.latitude const longitude = res.l ...

  3. 根据关键字获取高德地图poi信息

    根据关键字获取高德地图poi信息 百度地图和高德地图都提供了根据关键字获取相应的poi信息的api,不过它们提供给普通开发者使用的次数有限无法满足要求.其次百度地图返回的poi中位置信息不是经纬度,而 ...

  4. 高德地图首席科学家任小枫QA答疑汇总丨视觉+地图技术有哪些新玩法?

    上周,阿里巴巴高德地图首席科学家任小枫在#大咖学长云对话#的在线直播活动上就计算机视觉相关技术发展以及在地图出行领域的应用与大家做技术交流,直播间互动火爆,尤其在QA环节,学弟学妹们纷纷就感兴趣的视觉 ...

  5. web开发如何使用高德地图API(三)点击热点打开信息窗体

    说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...

  6. 高德地图搜索提示获取信息回传activity刷新ui(二)

    应用场景: 在主activity中点击进入到另一个activity搜索提示,获取经纬度,点确定返回到主activity,虽然说需求很奇葩,但是遇到了没办法.. 主要包含两部分,搜索提示+activit ...

  7. H5高德地图获取当前位置

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. QQ发送位置(高德地图)

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...

  9. 使用高德地图JS获取当前位置和经纬度

    先看效果,我做的是这样的,可以按地图位置来返回当前你点的位置(图一,二),也可以根据输入框的自动搜索(图三,四) HTML的代码: <div> <input type="t ...

随机推荐

  1. MySQL Table--独立表空间

    数据库表空间 独立表空间 在MySQL 5.6 中引入独立表空间的概念,启用独立表空间后,每个表将生成独立的文件来进行存储. 创建表时可以指定表存放的文件路径 ##首选需要确保innodb_file_ ...

  2. tensorflow--非线性回归

    算法步骤: 1. 给定训练样本,x_data和y_data 2. 定义两个占位符分别接收输入x和输出y 3. 中间层操作实际为:权值w与输入x矩阵相乘,加上偏差b后,得到中间层输出 4. 使用tanh ...

  3. Linux运维技术之yum与rpm的基本使用要点

    https://pkgs.org/ 与https://rpmfind.org/   RPM包下载 RPM包简介 1.安装与升级时,使用的是包全名 2.RPM包安装时要注意包的依赖性 RPM包操作(系统 ...

  4. QT,QT/E,Qtopia,qt creator的联系与区别

    关于qt,qte,qtopia,qt creator它们之间的区别和联系,相信对所有刚刚入门qt的同学来说都是很模糊的.我在刚开始接触qt的时候也是这样,而且我第一次接触的是qte,因为要在arm上开 ...

  5. Access denied for user '密码'@'192.18.0.0' (using password: YES)

    Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.6:generate (default- ...

  6. 201671030107 胡文艳 实验十四 团队项目评审&课程项目总结

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 1.掌握软件项目评审会议流程 ...

  7. php解析xml的几种方式

    php提供几种解析xml的类或方法,包括:Xml parser. SimpleXML,.XMLReader,.DOMDocument. XML Expat Parser: XML Parser使用Ex ...

  8. extern与头文件(*.h)的区别和联系

    原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/ 个人认为有一些道理:所以转过来学习了. 用#include ...

  9. 如何开发出优秀的APICloud应用

    APICloud定制平台项目实施规范 APICloud应用优化策略Top30 如何开发出运行体验良好.高性能的App 如何开发出客户满意.能够顺利交付的App 1. 引擎或模块问题: 遇到应用层无法解 ...

  10. nginx 篇

    nginx 安装 下载必要组件 nginx下载地址 http://nginx.org/en/download.html pcre库下载地址,nginx需要 http://sourceforge.net ...