|
|
|
// import 'dart:async';
|
|
|
|
// // import 'dart:js_interop';
|
|
|
|
import 'dart:async';
|
|
|
|
// import 'dart:js_interop';
|
|
|
|
|
|
|
|
// import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
|
|
// import 'package:csp_amap_flutter_map/csp_amap_flutter_map.dart';
|
|
|
|
// import 'package:csp_amap_flutter_location/amap_flutter_location.dart';
|
|
|
|
// import 'package:csp_amap_flutter_location/amap_location_option.dart';
|
|
|
|
// import 'package:flutter/cupertino.dart';
|
|
|
|
import 'package:csp_amap_flutter_map/csp_amap_flutter_map.dart';
|
|
|
|
import 'package:csp_amap_flutter_location/amap_flutter_location.dart';
|
|
|
|
import 'package:csp_amap_flutter_location/amap_location_option.dart';
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
|
|
|
|
|
// // import 'package:flutter/material.dart';
|
|
|
|
// import 'package:flutter/material.dart';
|
|
|
|
|
|
|
|
// import 'package:csp_amap_flutter_base/csp_amap_flutter_base.dart';
|
|
|
|
import 'package:csp_amap_flutter_base/csp_amap_flutter_base.dart';
|
|
|
|
|
|
|
|
// import 'package:flutter_easyrefresh/easy_refresh.dart';
|
|
|
|
|
|
|
|
// import 'package:one_key/pages/create_store/const_config.dart';
|
|
|
|
// import 'package:one_key/pages/create_store/map_inputs_model.dart';
|
|
|
|
|
|
|
|
// import 'package:one_key/res/colors.dart';
|
|
|
|
// import 'package:one_key/utils/common_utils.dart';
|
|
|
|
|
|
|
|
// import 'package:one_key/utils/misc.dart';
|
|
|
|
|
|
|
|
// import 'package:one_key/utils/screen_util.dart';
|
|
|
|
// import 'package:one_key/utils/utils.dart';
|
|
|
|
|
|
|
|
// import 'package:one_key/widgets/system_app_bar.dart';
|
|
|
|
// import 'package:permission_handler/permission_handler.dart';
|
|
|
|
|
|
|
|
// // import '../../utils/common_utils.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 MapChoicePointPage extends StatefulWidget {
|
|
|
|
// final String? long;
|
|
|
|
// final String? lat;
|
|
|
|
// MapChoicePointPage({Key? key, this.long, this.lat}) : super(key: key);
|
|
|
|
|
|
|
|
// @override
|
|
|
|
// _MapChoicePointPageState createState() => _MapChoicePointPageState();
|
|
|
|
// }
|
|
|
|
|
|
|
|
// class _MapChoicePointPageState extends State<MapChoicePointPage> {
|
|
|
|
// late AMapController _mapController;
|
|
|
|
// final double _minZoom = 3;
|
|
|
|
// final double _maxZoom = 20;
|
|
|
|
// String? _currentZoom;
|
|
|
|
// // List<Poi>? poiList;
|
|
|
|
// static List<PoiModel?> list = [];
|
|
|
|
// static List<PoiModel> searchlist = [];
|
|
|
|
// PoiModel? poiModel;
|
|
|
|
// String keyword = "";
|
|
|
|
// String? address = "";
|
|
|
|
// bool isloading = true;
|
|
|
|
|
|
|
|
// double latitude = 39.684670899;
|
|
|
|
// double longitude = 118.17630045;
|
|
|
|
|
|
|
|
// double latitudeLocation = 39.684670899;
|
|
|
|
// double longitudeLocation = 118.17630045;
|
|
|
|
|
|
|
|
// List<MapInputsModel> inputTipDatas = [];
|
|
|
|
// int page = 1;
|
|
|
|
// EasyRefreshController refreshController = EasyRefreshController();
|
|
|
|
// bool flag = true;
|
|
|
|
|
|
|
|
// /// 存储定位结果
|
|
|
|
// Map<String, Object>? _locationResult;
|
|
|
|
|
|
|
|
// /// 定位结果监听器
|
|
|
|
// StreamSubscription<Map<String, Object>>? _locationListener;
|
|
|
|
|
|
|
|
// /// 地理位置解析结果监听器
|
|
|
|
// StreamSubscription<Map<String, Object>>? _geocodeSearchListener;
|
|
|
|
|
|
|
|
// /// 高德定位插件实例
|
|
|
|
// final AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();
|
|
|
|
|
|
|
|
// @override
|
|
|
|
// void initState() {
|
|
|
|
// super.initState();
|
|
|
|
|
|
|
|
// if (widget.long != null && widget.long != '' && widget.long != 'null') {
|
|
|
|
// longitude = double.parse(widget.long!);
|
|
|
|
// }
|
|
|
|
// if (widget.lat != null && widget.lat != '' && widget.lat != 'null') {
|
|
|
|
// latitude = double.parse(widget.lat!);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// WidgetsBinding.instance.addPostFrameCallback((_) async {
|
|
|
|
// AMapInitializer.init(context, apiKey: ConstConfig.amapApiKeys);
|
|
|
|
// AMapInitializer.updatePrivacyAgree(ConstConfig.amapPrivacyStatement);
|
|
|
|
|
|
|
|
// AMapFlutterLocation.setApiKey("1dbf56e2e8a4d0e4cdc2df9efd36bc71",
|
|
|
|
// "dfb64c0463cb53927914364b5c09aba0",
|
|
|
|
// ohosKey: "7c2081e92ec65bfffa2df0a5464f0c7b");
|
|
|
|
|
|
|
|
// /// 设置是否已经包含高德隐私政策并弹窗展示显示用户查看,如果未包含或者没有弹窗展示,高德定位SDK将不会工作
|
|
|
|
// ///
|
|
|
|
// /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
|
|
|
|
// /// <b>必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意</b>
|
|
|
|
// ///
|
|
|
|
// /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
|
|
|
|
// ///
|
|
|
|
// /// [hasContains] 隐私声明中是否包含高德隐私政策说明
|
|
|
|
// ///
|
|
|
|
// /// [hasShow] 隐私权政策是否弹窗展示告知用户
|
|
|
|
// AMapFlutterLocation.updatePrivacyShow(true, true);
|
|
|
|
|
|
|
|
// /// 设置是否已经取得用户同意,如果未取得用户同意,高德定位SDK将不会工作
|
|
|
|
// ///
|
|
|
|
// /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
|
|
|
|
// ///
|
|
|
|
// /// <b>必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意</b>
|
|
|
|
// ///
|
|
|
|
// /// [hasAgree] 隐私权政策是否已经取得用户同意
|
|
|
|
// AMapFlutterLocation.updatePrivacyAgree(true);
|
|
|
|
// _requestLocationPermission();
|
|
|
|
|
|
|
|
// // ama
|
|
|
|
// // let marker = new AMap.Marker({//添加标记点
|
|
|
|
// // position: this.position,
|
|
|
|
// // map: map
|
|
|
|
// });
|
|
|
|
|
|
|
|
// _geocodeSearchListener = _locationPlugin
|
|
|
|
// .onGeocodeSearchChange()
|
|
|
|
// .listen((Map<String, Object> result) {
|
|
|
|
// // setState(() {
|
|
|
|
|
|
|
|
// if (result.containsKey('errorCode')) {
|
|
|
|
// Utils.showToast(result['errorInfo'].toString());
|
|
|
|
// } else {
|
|
|
|
// _locationResult = result;
|
|
|
|
|
|
|
|
// print(_locationResult);
|
|
|
|
// }
|
|
|
|
// });
|
|
|
|
|
|
|
|
// /// 注册定位结果监听
|
|
|
|
// /// 通过监听器接收定位结果并更新UI
|
|
|
|
// _locationListener = _locationPlugin
|
|
|
|
// .onLocationChanged()
|
|
|
|
// .listen((Map<String, Object> result) {
|
|
|
|
// // setState(() {
|
|
|
|
|
|
|
|
// if (result.containsKey('errorCode')) {
|
|
|
|
// Utils.showToast(result['errorInfo'].toString());
|
|
|
|
// } else {
|
|
|
|
// _locationResult = result;
|
|
|
|
|
|
|
|
// print(_locationResult);
|
|
|
|
|
|
|
|
// if (result['latitude'] == null || result['latitude'] == '') //网络不好,定位失败
|
|
|
|
// {
|
|
|
|
// // App.sp.setString("lat", "39.684670899");
|
|
|
|
// // App.sp.setString("lng", "118.17630045");
|
|
|
|
// } else {
|
|
|
|
// if (widget.long == null ||
|
|
|
|
// widget.long == '' ||
|
|
|
|
// widget.long == 'null') {
|
|
|
|
// latitude = double.parse(result['latitude'].toString());
|
|
|
|
// longitude = double.parse(result['longitude'].toString());
|
|
|
|
// // if (_mapController != null) {
|
|
|
|
// _mapController.moveCamera(
|
|
|
|
// CameraUpdate.newLatLng(LatLng(latitude, longitude)));
|
|
|
|
|
|
|
|
// // }
|
|
|
|
// page = 1;
|
|
|
|
|
|
|
|
// // _loadData(LatLng(latitude, longitude));
|
|
|
|
|
|
|
|
// // setState(() {});
|
|
|
|
// }
|
|
|
|
// latitudeLocation = latitude;
|
|
|
|
// longitudeLocation = longitude;
|
|
|
|
// _mapController.moveCamera(
|
|
|
|
// CameraUpdate.newLatLng(LatLng(latitudeLocation, longitudeLocation)),
|
|
|
|
// animated: true,
|
|
|
|
// );
|
|
|
|
// _loadData(LatLng(latitude, longitude));
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// });
|
|
|
|
// }
|
|
|
|
|
|
|
|
// @override
|
|
|
|
// void dispose() {
|
|
|
|
// super.dispose();
|
|
|
|
|
|
|
|
// /// 移除定位监听
|
|
|
|
// /// 防止内存泄漏
|
|
|
|
// if (null != _locationListener) {
|
|
|
|
// _locationListener?.cancel();
|
|
|
|
// }
|
|
|
|
|
|
|
|
// if (null != _geocodeSearchListener) {
|
|
|
|
// _geocodeSearchListener?.cancel();
|
|
|
|
// }
|
|
|
|
|
|
|
|
// /// 销毁定位
|
|
|
|
// /// 释放定位资源
|
|
|
|
// _locationPlugin.destroy();
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // Future<bool> checkLocationPermission() async {
|
|
|
|
// // PermissionStatus permissionStatus = await Permission.location.status;
|
|
|
|
// // if (permissionStatus == PermissionStatus.granted) {
|
|
|
|
// // return true;
|
|
|
|
// // } else {
|
|
|
|
// // return false;
|
|
|
|
// // }
|
|
|
|
// // }
|
|
|
|
|
|
|
|
// /// 检查权限并定
|
|
|
|
// // _getLocationPermission() async {
|
|
|
|
// // if (!(await checkPermission(Permission.location))) {
|
|
|
|
// // //没有定位权限
|
|
|
|
|
|
|
|
// // //申请定位权限
|
|
|
|
// // _requestLocationPermission();
|
|
|
|
// // } else {
|
|
|
|
// // //去定位
|
|
|
|
// // _requestLocationPermission();
|
|
|
|
// // }
|
|
|
|
// // }
|
|
|
|
|
|
|
|
// /// 设置定位参数
|
|
|
|
// /// 配置定位选项,如精度、频率等
|
|
|
|
// void _setLocationOption() {
|
|
|
|
// AMapLocationOption locationOption = new AMapLocationOption();
|
|
|
|
|
|
|
|
// /// 是否单次定位
|
|
|
|
// /// false表示连续定位
|
|
|
|
// locationOption.onceLocation = true;
|
|
|
|
|
|
|
|
// /// 是否需要返回逆地理信息
|
|
|
|
// /// true表示需要返回地址信息
|
|
|
|
// locationOption.needAddress = true;
|
|
|
|
|
|
|
|
// /// 是否需要返回逆地理编码信息
|
|
|
|
// locationOption.locatingWithReGeocode = true;
|
|
|
|
|
|
|
|
// /// 逆地理信息的语言类型
|
|
|
|
// /// 默认为自动适配当前系统语言
|
|
|
|
// locationOption.geoLanguage = GeoLanguage.DEFAULT;
|
|
|
|
|
|
|
|
// /// iOS 14定位精度权限设置
|
|
|
|
// /// 设置为模糊定位精度
|
|
|
|
// locationOption.desiredLocationAccuracyAuthorizationMode =
|
|
|
|
// AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
|
|
|
|
|
|
|
|
// /// iOS 14精确定位目的key
|
|
|
|
// /// 需要与info.plist中配置一致
|
|
|
|
// locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
|
|
|
|
|
|
|
|
// /// 设置Android端连续定位的定位间隔
|
|
|
|
// /// 单位:毫秒
|
|
|
|
// locationOption.locationInterval = 2000;
|
|
|
|
|
|
|
|
// /// 设置Android端的定位模式
|
|
|
|
// /// 可选值:
|
|
|
|
// /// [AMapLocationMode.Battery_Saving] 低功耗模式
|
|
|
|
// /// [AMapLocationMode.Device_Sensors] 仅设备模式
|
|
|
|
// /// [AMapLocationMode.Hight_Accuracy] 高精度模式
|
|
|
|
// locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
|
|
|
|
|
|
|
|
// /// 设置iOS端的定位最小更新距离
|
|
|
|
// /// -1表示不限制距离
|
|
|
|
// locationOption.distanceFilter = -1;
|
|
|
|
|
|
|
|
// /// 设置iOS端期望的定位精度
|
|
|
|
// /// 可选值:
|
|
|
|
// /// [DesiredAccuracy.Best] 最高精度
|
|
|
|
// /// [DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度
|
|
|
|
// /// [DesiredAccuracy.NearestTenMeters] 10米
|
|
|
|
// /// [DesiredAccuracy.Kilometer] 1000米
|
|
|
|
// /// [DesiredAccuracy.ThreeKilometers] 3000米
|
|
|
|
// locationOption.desiredAccuracy = DesiredAccuracy.Best;
|
|
|
|
|
|
|
|
// /// 设置iOS端是否允许系统暂停定位
|
|
|
|
// /// false表示不允许系统暂停定位
|
|
|
|
// locationOption.pausesLocationUpdatesAutomatically = false;
|
|
|
|
|
|
|
|
// /// 将定位参数设置给定位插件
|
|
|
|
// _locationPlugin.setLocationOption(locationOption);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// /// 获取定位权限
|
|
|
|
// _requestLocationPermission() async {
|
|
|
|
// /// [hasShow] 隐私权政策是否弹窗展示告知用户
|
|
|
|
// AMapFlutterLocation.updatePrivacyShow(true, true);
|
|
|
|
|
|
|
|
// /// [hasAgree] 隐私权政策是否已经取得用户同意
|
|
|
|
// AMapFlutterLocation.updatePrivacyAgree(true);
|
|
|
|
// // await AMapFlutterLocation.instance.updatePrivacyShow(true);
|
|
|
|
// // await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
// bool canLocation = false;
|
|
|
|
|
|
|
|
// if (!(await checkPermission(Permission.location))) {
|
|
|
|
// //没有定位权限
|
|
|
|
|
|
|
|
// //申请定位权限
|
|
|
|
// canLocation = await requestPermission(Permission.location);
|
|
|
|
// } else {
|
|
|
|
// canLocation = true;
|
|
|
|
// }
|
|
|
|
// // bool canLocation = await requestPermission(Permission.location);
|
|
|
|
// // 单次定位
|
|
|
|
// if (canLocation) {
|
|
|
|
// Future.delayed(Duration(milliseconds: 200), () async {
|
|
|
|
// /// [hasShow] 隐私权政策是否弹窗展示告知用户
|
|
|
|
// AMapFlutterLocation.updatePrivacyShow(true, true);
|
|
|
|
|
|
|
|
// /// [hasAgree] 隐私权政策是否已经取得用户同意
|
|
|
|
// AMapFlutterLocation.updatePrivacyAgree(true);
|
|
|
|
// _startLocation();
|
|
|
|
// // final location = await AmapLocation.instance.fetchLocation(
|
|
|
|
// // // needAddress: true,
|
|
|
|
// // // mode: LocationAccuracy.High,
|
|
|
|
// // // timeout: Duration(seconds: 10)
|
|
|
|
// // );
|
|
|
|
|
|
|
|
// // if (location.city == null || location.city == '') //网络不好,定位失败
|
|
|
|
// // {
|
|
|
|
// // // App.sp.setString("lat", "39.684670899");
|
|
|
|
// // // App.sp.setString("lng", "118.17630045");
|
|
|
|
// // } else {
|
|
|
|
// // if (widget.long == null ||
|
|
|
|
// // widget.long == '' ||
|
|
|
|
// // widget.long == 'null') {
|
|
|
|
// // latitude = location.latLng!.latitude;
|
|
|
|
// // longitude = location.latLng!.longitude;
|
|
|
|
// // if (_controller != null) {
|
|
|
|
// // _controller!.setCenterCoordinate(LatLng(
|
|
|
|
// // location.latLng!.latitude, location.latLng!.longitude));
|
|
|
|
// // }
|
|
|
|
|
|
|
|
// // page = 1;
|
|
|
|
|
|
|
|
// // _loadData(
|
|
|
|
// // LatLng(location.latLng!.latitude, location.latLng!.longitude));
|
|
|
|
|
|
|
|
// // setState(() {});
|
|
|
|
// // }
|
|
|
|
// // latitudeLocation = location.latLng!.latitude;
|
|
|
|
// // longitudeLocation = location.latLng!.longitude;
|
|
|
|
// // }
|
|
|
|
// });
|
|
|
|
// } else {
|
|
|
|
// //无权限
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 开始定位
|
|
|
|
// /// 设置定位参数并启动定位
|
|
|
|
// void _startLocation() {
|
|
|
|
// /// 开始定位之前设置定位参数
|
|
|
|
// _setLocationOption();
|
|
|
|
// _locationPlugin.startLocation();
|
|
|
|
// }
|
|
|
|
|
|
|
|
// /// 停止定位
|
|
|
|
// /// 停止定位服务
|
|
|
|
// void _stopLocation() {
|
|
|
|
// _locationPlugin.stopLocation();
|
|
|
|
// }
|
|
|
|
|
|
|
|
// void onMapCreated(AMapController controller) {
|
|
|
|
// // setState(() {
|
|
|
|
// _mapController = controller;
|
|
|
|
// // _mapController.moveCamera(
|
|
|
|
// // CameraUpdate.newLatLng(LatLng(latitudeLocation, longitudeLocation)),
|
|
|
|
// // animated: true,
|
|
|
|
// // );
|
|
|
|
// // getApprovalNumber();
|
|
|
|
// // });
|
|
|
|
// }
|
|
|
|
|
|
|
|
// /// 获取审图号
|
|
|
|
// // void getApprovalNumber() async {
|
|
|
|
// // //普通地图审图号
|
|
|
|
// // String mapContentApprovalNumber =
|
|
|
|
// // (await _mapController.getMapContentApprovalNumber());
|
|
|
|
// // //卫星地图审图号
|
|
|
|
// // String satelliteImageApprovalNumber =
|
|
|
|
// // (await _mapController.getSatelliteImageApprovalNumber());
|
|
|
|
|
|
|
|
// // print('地图审图号(普通地图): $mapContentApprovalNumber');
|
|
|
|
// // print('地图审图号(卫星地图): $satelliteImageApprovalNumber');
|
|
|
|
// // }
|
|
|
|
|
|
|
|
// //移动视野
|
|
|
|
// // void _onCameraMove(CameraPosition cameraPosition) {
|
|
|
|
// // latitude = cameraPosition.target.latitude;
|
|
|
|
// // longitude = cameraPosition.target.longitude;
|
|
|
|
// // page = 1;
|
|
|
|
// // _loadData(cameraPosition.target);
|
|
|
|
// // }
|
|
|
|
|
|
|
|
// //移动地图结束
|
|
|
|
// void _onCameraMoveEnd(CameraPosition cameraPosition) {
|
|
|
|
// setState(() {
|
|
|
|
// _currentZoom = '当前缩放级别:${cameraPosition.zoom}';
|
|
|
|
// });
|
|
|
|
|
|
|
|
// _mapController.moveCamera(
|
|
|
|
// CameraUpdate.zoomTo(cameraPosition.zoom),
|
|
|
|
// animated: true,
|
|
|
|
// );
|
|
|
|
// latitude = cameraPosition.target.latitude;
|
|
|
|
// longitude = cameraPosition.target.longitude;
|
|
|
|
// page = 1;
|
|
|
|
// _loadData(cameraPosition.target);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// @override
|
|
|
|
// Widget build(BuildContext context) {
|
|
|
|
// final AMapWidget amap = AMapWidget(
|
|
|
|
// initialCameraPosition:
|
|
|
|
// CameraPosition(target: LatLng(latitude, longitude), zoom: 16),
|
|
|
|
// onMapCreated: onMapCreated,
|
|
|
|
// // onCameraMove: _onCameraMove,
|
|
|
|
// onCameraMoveEnd: _onCameraMoveEnd,
|
|
|
|
// minMaxZoomPreference: MinMaxZoomPreference(_minZoom, _maxZoom),
|
|
|
|
// scaleEnabled: true,
|
|
|
|
// );
|
|
|
|
|
|
|
|
// return Scaffold(
|
|
|
|
// resizeToAvoidBottomInset: false, //防止底部布局被顶起
|
|
|
|
// appBar: SystemAppBar(
|
|
|
|
// '选择位置信息',
|
|
|
|
// onTap: () {
|
|
|
|
// if (Navigator.canPop(context)) {
|
|
|
|
// Navigator.pop(context);
|
|
|
|
// }
|
|
|
|
// },
|
|
|
|
// ),
|
|
|
|
|
|
|
|
// body: Column(
|
|
|
|
// children: <Widget>[
|
|
|
|
// // Theme(
|
|
|
|
// // data: new
|
|
|
|
// // ThemeData(
|
|
|
|
// // // primaryColor: MyColours.color_438E93,
|
|
|
|
// // // hintColor: MyColours.color_438E93),
|
|
|
|
// // child:
|
|
|
|
// // Container(
|
|
|
|
// // color: MyColours.color_438E93,
|
|
|
|
// // decoration: BoxDecoration(
|
|
|
|
// // color: MyColours.color_438E93,
|
|
|
|
// // boxShadow: [
|
|
|
|
// // BoxShadow(color: Colors.white, spreadRadius: 1),
|
|
|
|
// // ],
|
|
|
|
// // ),
|
|
|
|
|
|
|
|
// // padding: EdgeInsets.all(5),
|
|
|
|
// // child:
|
|
|
|
|
|
|
|
// // ),
|
|
|
|
// // ),
|
|
|
|
// // ListView.builder(
|
|
|
|
// // shrinkWrap: true,
|
|
|
|
// // itemCount: inputTipDatas.length,
|
|
|
|
// // itemBuilder: (context, index) {
|
|
|
|
// // InputTip inputTip = inputTipDatas[index];
|
|
|
|
// // return InkWell(
|
|
|
|
// // onTap: () {
|
|
|
|
// // // searchAroundAddress(inputTip.name ?? '');
|
|
|
|
// // // searchPoiId(inputTip.poiId ?? '');
|
|
|
|
// // // _loadData(inputTip.coordinate ??
|
|
|
|
// // // LatLng(latitude, longitude));
|
|
|
|
// // },
|
|
|
|
// // child: Container(
|
|
|
|
// // child: Row(
|
|
|
|
// // children: [
|
|
|
|
// // Text(
|
|
|
|
// // inputTip.name ?? '',
|
|
|
|
// // style: TextStyle(
|
|
|
|
// // fontSize: font(15),
|
|
|
|
// // color: MyColours.color_515151),
|
|
|
|
// // ),
|
|
|
|
// // HEmptyView(10),
|
|
|
|
// // Expanded(
|
|
|
|
// // child: Text(
|
|
|
|
// // (inputTip.district ?? '') +
|
|
|
|
// // (inputTip.address ?? ''),
|
|
|
|
// // style: TextStyle(
|
|
|
|
// // fontSize: font(13),
|
|
|
|
// // color: MyColours.color_999999),
|
|
|
|
// // ),
|
|
|
|
// // ),
|
|
|
|
// // ],
|
|
|
|
// // )));
|
|
|
|
// // })
|
|
|
|
// // ],
|
|
|
|
// // ),
|
|
|
|
|
|
|
|
// Stack(
|
|
|
|
// children: [
|
|
|
|
// Container(
|
|
|
|
// height: w(300),
|
|
|
|
// child: Stack(
|
|
|
|
// children: <Widget>[
|
|
|
|
// amap,
|
|
|
|
// // AmapView(
|
|
|
|
// // showZoomControl: false,
|
|
|
|
|
|
|
|
// // /// 是否显示指南针控件
|
|
|
|
// // showCompass: true,
|
|
|
|
|
|
|
|
// // /// 是否显示比例尺控件
|
|
|
|
// // showScaleControl: true,
|
|
|
|
|
|
|
|
// // /// 是否使能缩放手势
|
|
|
|
// // zoomGesturesEnabled: true,
|
|
|
|
|
|
|
|
// // /// 是否使能滚动手势
|
|
|
|
// // scrollGesturesEnabled: true,
|
|
|
|
|
|
|
|
// // /// 是否使能旋转手势
|
|
|
|
// // rotateGestureEnabled: false,
|
|
|
|
// // centerCoordinate: LatLng(latitude, longitude),
|
|
|
|
// // maskDelay: Duration(milliseconds: 500),
|
|
|
|
// // zoomLevel: 19,
|
|
|
|
// // onMapCreated: (controller) async {
|
|
|
|
// // _controller = controller;
|
|
|
|
// // _controller!
|
|
|
|
// // .setCenterCoordinate(LatLng(latitude, longitude));
|
|
|
|
// // // if (await requestPermission(PermissionGroup.location)) {
|
|
|
|
// // // await controller.showMyLocation(true);
|
|
|
|
// // // await controller?.showLocateControl(true);
|
|
|
|
// // // final latLng = await _controller?.getLocation(
|
|
|
|
// // // delay: Duration(seconds: 2));
|
|
|
|
// // // await enableFluttifyLog(false); // 关闭log
|
|
|
|
// // // _loadData(latLng);
|
|
|
|
// // // } else {
|
|
|
|
// // // //无权限
|
|
|
|
// // // _showLocPemWidget();
|
|
|
|
// // // }
|
|
|
|
// // },
|
|
|
|
// // // markers: [],
|
|
|
|
// // onMapMoveEnd: (MapMove move) async {
|
|
|
|
// // latitude = move.coordinate!.latitude;
|
|
|
|
// // longitude = move.coordinate!.longitude;
|
|
|
|
// // page = 1;
|
|
|
|
// // _loadData(move.coordinate!);
|
|
|
|
// // },
|
|
|
|
// // ),
|
|
|
|
// Center(
|
|
|
|
// child: Icon(
|
|
|
|
// Icons.place,
|
|
|
|
// size: w(32),
|
|
|
|
// color: Color(0xFFFF0000),
|
|
|
|
// ),
|
|
|
|
// ),
|
|
|
|
// Positioned(
|
|
|
|
// right: w(10),
|
|
|
|
// bottom: w(10),
|
|
|
|
// child: InkWell(
|
|
|
|
// onTap: () {
|
|
|
|
// _mapController.moveCamera(
|
|
|
|
// CameraUpdate.newLatLng(
|
|
|
|
// LatLng(latitudeLocation, longitudeLocation)),
|
|
|
|
// animated: true,
|
|
|
|
// );
|
|
|
|
// },
|
|
|
|
// child: Container(
|
|
|
|
// decoration: BoxDecoration(
|
|
|
|
// color: MyColours.color_ffffff,
|
|
|
|
// borderRadius: BorderRadius.circular(r(5))),
|
|
|
|
// padding: EdgeInsets.all(w(5)),
|
|
|
|
// child: Image.asset(
|
|
|
|
// Utils.getImgPath('location_map'),
|
|
|
|
// width: w(25),
|
|
|
|
// ),
|
|
|
|
// )),
|
|
|
|
// )
|
|
|
|
// ],
|
|
|
|
// ),
|
|
|
|
// ),
|
|
|
|
// Positioned(
|
|
|
|
// top: w(10),
|
|
|
|
// left: w(20),
|
|
|
|
// right: w(20),
|
|
|
|
// child: Container(
|
|
|
|
// // height: w(45),
|
|
|
|
// padding: EdgeInsets.symmetric(vertical: w(10)),
|
|
|
|
// decoration: BoxDecoration(
|
|
|
|
// color: Colors.white,
|
|
|
|
// borderRadius: BorderRadius.circular(r(10))),
|
|
|
|
// child: TextField(
|
|
|
|
// textAlignVertical: TextAlignVertical.center,
|
|
|
|
// style: TextStyle(
|
|
|
|
// color: MyColours.color_515151,
|
|
|
|
// fontSize: font(15),
|
|
|
|
// ),
|
|
|
|
// controller:
|
|
|
|
// TextEditingController.fromValue(TextEditingValue(
|
|
|
|
// // 设置内容
|
|
|
|
// text: keyword,
|
|
|
|
// selection: TextSelection.fromPosition(TextPosition(
|
|
|
|
// affinity: TextAffinity.downstream,
|
|
|
|
// offset: keyword.length)),
|
|
|
|
// // 保持光标在最后
|
|
|
|
// )),
|
|
|
|
// decoration: InputDecoration(
|
|
|
|
// // border: b,
|
|
|
|
// // border: OutlineInputBorder(
|
|
|
|
// // borderRadius: BorderRadius.all(Radius.circular(40)),
|
|
|
|
// // ),
|
|
|
|
// border: OutlineInputBorder(borderSide: BorderSide.none),
|
|
|
|
// hintText: '输入关键字',
|
|
|
|
// isCollapsed: true,
|
|
|
|
|
|
|
|
// hintStyle: TextStyle(
|
|
|
|
// color: MyColours.color_999999, fontSize: font(15)),
|
|
|
|
// // contentPadding: const EdgeInsets.symmetric(
|
|
|
|
// // vertical: 8, horizontal: 1),
|
|
|
|
// prefixIconConstraints: BoxConstraints(maxWidth: w(40)),
|
|
|
|
// prefixIcon: Padding(
|
|
|
|
// padding: EdgeInsets.only(left: w(10), right: w(10)),
|
|
|
|
// child: SizedBox(
|
|
|
|
// width: w(30),
|
|
|
|
// child: Image.asset(
|
|
|
|
// Utils.getImgPath('search_black'),
|
|
|
|
// ))),
|
|
|
|
// suffixIconConstraints: BoxConstraints(maxWidth: w(32)),
|
|
|
|
// suffixIcon: InkWell(
|
|
|
|
// child: Padding(
|
|
|
|
// padding: EdgeInsets.only(left: w(10), right: w(10)),
|
|
|
|
// child: SizedBox(
|
|
|
|
// width: w(22),
|
|
|
|
// child: Image.asset(
|
|
|
|
// Utils.getImgPath('delete_black'),
|
|
|
|
// ))),
|
|
|
|
// onTap: () {
|
|
|
|
// keyword = "";
|
|
|
|
// setState(() {});
|
|
|
|
// },
|
|
|
|
// ),
|
|
|
|
// fillColor: Colors.white,
|
|
|
|
// filled: true,
|
|
|
|
// ),
|
|
|
|
|
|
|
|
// inputFormatters: [],
|
|
|
|
// //内容改变的回调
|
|
|
|
// onChanged: (text) {
|
|
|
|
// print('change $text');
|
|
|
|
// keyword = text;
|
|
|
|
|
|
|
|
// //搜索
|
|
|
|
|
|
|
|
// if (text != null && text.trim().length > 0) {
|
|
|
|
// JhCommonUtils.debounce(
|
|
|
|
// () => _fetchInputTips(text.toString()));
|
|
|
|
// }
|
|
|
|
// },
|
|
|
|
// //内容提交(按回车)的回调
|
|
|
|
// onSubmitted: (text) {
|
|
|
|
// print('submit $text');
|
|
|
|
// // 触发关闭弹出来的键盘。
|
|
|
|
// keyword = text;
|
|
|
|
// FocusScope.of(context).requestFocus(FocusNode());
|
|
|
|
// setState(() {
|
|
|
|
// // isloading = true;
|
|
|
|
// });
|
|
|
|
|
|
|
|
// // _fetchInputTips(text.toString());
|
|
|
|
|
|
|
|
// // searchAroundAddress(text.toString());
|
|
|
|
// },
|
|
|
|
// //按回车时调用
|
|
|
|
// onEditingComplete: () {
|
|
|
|
// print('onEditingComplete');
|
|
|
|
// },
|
|
|
|
// ),
|
|
|
|
// ),
|
|
|
|
// )
|
|
|
|
// ],
|
|
|
|
// ),
|
|
|
|
|
|
|
|
// Expanded(
|
|
|
|
// flex: 1,
|
|
|
|
// child: Visibility(
|
|
|
|
// visible: !isloading,
|
|
|
|
// maintainSize: false,
|
|
|
|
// maintainSemantics: false,
|
|
|
|
// maintainInteractivity: false,
|
|
|
|
// replacement: Center(
|
|
|
|
// child: CupertinoActivityIndicator(),
|
|
|
|
// ),
|
|
|
|
// child: EasyRefresh.custom(
|
|
|
|
// controller: refreshController,
|
|
|
|
// slivers: [
|
|
|
|
// SliverList(
|
|
|
|
// delegate: SliverChildBuilderDelegate(
|
|
|
|
// (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,
|
|
|
|
// ),
|
|
|
|
// Expanded(
|
|
|
|
// child: 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(
|
|
|
|
// // LatLng(item.latLng.latitude, item.latLng.longitude),
|
|
|
|
// // zoomLevel: 16);
|
|
|
|
// if (Navigator.canPop(context)) {
|
|
|
|
// Navigator.pop(context, {
|
|
|
|
// 'address': item.address,
|
|
|
|
// 'lat': item.latLng!.latitude.toString(),
|
|
|
|
// 'lng': item.latLng!.longitude.toString()
|
|
|
|
// });
|
|
|
|
// }
|
|
|
|
// },
|
|
|
|
// );
|
|
|
|
// },
|
|
|
|
// childCount: list.length,
|
|
|
|
// ),
|
|
|
|
// )
|
|
|
|
// ],
|
|
|
|
// onRefresh: () async {
|
|
|
|
// if (flag) {
|
|
|
|
// page = 1;
|
|
|
|
// _loadData(LatLng(latitude, longitude));
|
|
|
|
// }
|
|
|
|
// },
|
|
|
|
// onLoad: () async {
|
|
|
|
// if (flag) {
|
|
|
|
// page++;
|
|
|
|
// _loadData(LatLng(latitude, longitude),
|
|
|
|
// showloading: false);
|
|
|
|
// }
|
|
|
|
// },
|
|
|
|
// )),
|
|
|
|
// ),
|
|
|
|
// ],
|
|
|
|
// ),
|
|
|
|
// );
|
|
|
|
// }
|
|
|
|
|
|
|
|
// _fetchInputTips(String text) async {
|
|
|
|
// flag = false;
|
|
|
|
// page = 1;
|
|
|
|
// // setState(() {
|
|
|
|
// // isloading = true;
|
|
|
|
// // });
|
|
|
|
|
|
|
|
// /// 逆地理编码(坐标转地址)
|
|
|
|
// ///
|
|
|
|
// ///
|
|
|
|
// // await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// // await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
|
|
|
|
// LatLng latLng = LatLng(latitude, longitude);
|
|
|
|
|
|
|
|
// address = await _locationPlugin
|
|
|
|
// .onGeocodeSearch(true, [latLng.longitude, latLng.latitude]);
|
|
|
|
|
|
|
|
// // await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// // await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
|
|
|
|
// List<dynamic> temp = await _locationPlugin.doInputtipsRequest(
|
|
|
|
// text,
|
|
|
|
// city: "",
|
|
|
|
// );
|
|
|
|
|
|
|
|
// inputTipDatas = [];
|
|
|
|
|
|
|
|
// temp.forEach((element) {
|
|
|
|
// inputTipDatas.add(MapInputsModel.fromJson(element));
|
|
|
|
// });
|
|
|
|
|
|
|
|
// print(inputTipDatas);
|
|
|
|
// poiModel = new PoiModel("当前位置", address, latLng);
|
|
|
|
// list.clear();
|
|
|
|
// list.add(poiModel);
|
|
|
|
// for (var inputTip in inputTipDatas) {
|
|
|
|
// String? title = await inputTip.name ?? '';
|
|
|
|
// String? cityStr = (inputTip.district ?? '') + (inputTip.city ?? '');
|
|
|
|
|
|
|
|
// // LatLng? latLng = await inputTip.point;
|
|
|
|
|
|
|
|
// list.add(new PoiModel(title.toString(), cityStr, latLng));
|
|
|
|
// }
|
|
|
|
|
|
|
|
// print(list);
|
|
|
|
|
|
|
|
// setState(() {
|
|
|
|
// // isloading = false;
|
|
|
|
// });
|
|
|
|
// }
|
|
|
|
|
|
|
|
// void _loadData(LatLng latLng, {showloading = true}) async {
|
|
|
|
// flag = true;
|
|
|
|
// setState(() {
|
|
|
|
// if (showloading) {
|
|
|
|
// isloading = true;
|
|
|
|
// }
|
|
|
|
// });
|
|
|
|
|
|
|
|
// /// 逆地理编码(坐标转地址)
|
|
|
|
// ///
|
|
|
|
// ///
|
|
|
|
// ///
|
|
|
|
|
|
|
|
// // await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// // await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
// if (page == 1) {
|
|
|
|
// address = await _locationPlugin
|
|
|
|
// .onGeocodeSearch(true, [latLng.longitude, latLng.latitude]);
|
|
|
|
// poiModel = new PoiModel("当前位置", address, latLng);
|
|
|
|
// list.clear();
|
|
|
|
// list.add(poiModel);
|
|
|
|
// }
|
|
|
|
// // final poiList
|
|
|
|
// List<dynamic> temp = await _locationPlugin.poiSearchAround(
|
|
|
|
// keyword, latLng.longitude, latLng.latitude);
|
|
|
|
|
|
|
|
// List<MapRoundSearchModel> searchData = [];
|
|
|
|
|
|
|
|
// temp.forEach((element) {
|
|
|
|
// searchData.add(MapRoundSearchModel.fromJson(element));
|
|
|
|
// });
|
|
|
|
|
|
|
|
// print(searchData);
|
|
|
|
|
|
|
|
// for (var poi in searchData) {
|
|
|
|
// String? title = await poi.title;
|
|
|
|
// String? cityName = await poi.cityName;
|
|
|
|
// String? provinceName = await poi.provinceName;
|
|
|
|
// String? snippet = await poi.snippet;
|
|
|
|
// String? adName = await poi.adName;
|
|
|
|
// LatLng? latLng = LatLng(poi.latitude ?? 0, poi.longitude ?? 0);
|
|
|
|
// String? bussniss = poi.businessArea;
|
|
|
|
|
|
|
|
// list.add(new PoiModel(
|
|
|
|
// title.toString(),
|
|
|
|
// provinceName.toString() +
|
|
|
|
// cityName.toString() +
|
|
|
|
// adName.toString() +
|
|
|
|
// // address.toString() +
|
|
|
|
// bussniss.toString() +
|
|
|
|
// snippet.toString(),
|
|
|
|
// latLng));
|
|
|
|
// }
|
|
|
|
|
|
|
|
// setState(() {
|
|
|
|
// if (showloading) {
|
|
|
|
// isloading = false;
|
|
|
|
// }
|
|
|
|
// });
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // void searchPoiId(String text) async {
|
|
|
|
// // await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// // await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
// // Poi? poi = await AmapSearch.instance.searchPoiId(
|
|
|
|
// // text,
|
|
|
|
// // );
|
|
|
|
// // print(poi);
|
|
|
|
// // }
|
|
|
|
|
|
|
|
// // void searchAroundAddress(String text) async {
|
|
|
|
// // await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// // await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
// // final poiList = await AmapSearch.instance.searchKeyword(
|
|
|
|
// // text,
|
|
|
|
// // city: "",
|
|
|
|
// // );
|
|
|
|
// // // final poiList = await AmapSearch.instance.searchAround(
|
|
|
|
// // // LatLng(latitude, longitude),
|
|
|
|
// // // city: "",
|
|
|
|
// // // radius: 100000000000000
|
|
|
|
|
|
|
|
// // // );
|
|
|
|
|
|
|
|
// // 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);
|
|
|
|
// } |
|
|
|
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
|
|
|
|
|
|
|
import 'package:one_key/pages/create_store/const_config.dart';
|
|
|
|
import 'package:one_key/pages/create_store/map_inputs_model.dart';
|
|
|
|
|
|
|
|
import 'package:one_key/res/colors.dart';
|
|
|
|
import 'package:one_key/utils/common_utils.dart';
|
|
|
|
|
|
|
|
import 'package:one_key/utils/misc.dart';
|
|
|
|
|
|
|
|
import 'package:one_key/utils/screen_util.dart';
|
|
|
|
import 'package:one_key/utils/utils.dart';
|
|
|
|
|
|
|
|
import 'package:one_key/widgets/system_app_bar.dart';
|
|
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
|
|
|
|
// import '../../utils/common_utils.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 MapChoicePointPage extends StatefulWidget {
|
|
|
|
final String? long;
|
|
|
|
final String? lat;
|
|
|
|
MapChoicePointPage({Key? key, this.long, this.lat}) : super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
|
|
_MapChoicePointPageState createState() => _MapChoicePointPageState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _MapChoicePointPageState extends State<MapChoicePointPage> {
|
|
|
|
late AMapController _mapController;
|
|
|
|
final double _minZoom = 3;
|
|
|
|
final double _maxZoom = 20;
|
|
|
|
String? _currentZoom;
|
|
|
|
// List<Poi>? poiList;
|
|
|
|
static List<PoiModel?> list = [];
|
|
|
|
static List<PoiModel> searchlist = [];
|
|
|
|
PoiModel? poiModel;
|
|
|
|
String keyword = "";
|
|
|
|
String? address = "";
|
|
|
|
bool isloading = true;
|
|
|
|
|
|
|
|
double latitude = 39.684670899;
|
|
|
|
double longitude = 118.17630045;
|
|
|
|
|
|
|
|
double latitudeLocation = 39.684670899;
|
|
|
|
double longitudeLocation = 118.17630045;
|
|
|
|
|
|
|
|
List<MapInputsModel> inputTipDatas = [];
|
|
|
|
int page = 1;
|
|
|
|
EasyRefreshController refreshController = EasyRefreshController();
|
|
|
|
bool flag = true;
|
|
|
|
|
|
|
|
/// 存储定位结果
|
|
|
|
Map<String, Object>? _locationResult;
|
|
|
|
|
|
|
|
/// 定位结果监听器
|
|
|
|
StreamSubscription<Map<String, Object>>? _locationListener;
|
|
|
|
|
|
|
|
/// 地理位置解析结果监听器
|
|
|
|
StreamSubscription<Map<String, Object>>? _geocodeSearchListener;
|
|
|
|
|
|
|
|
/// 高德定位插件实例
|
|
|
|
final AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();
|
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
|
|
|
|
if (widget.long != null && widget.long != '' && widget.long != 'null') {
|
|
|
|
longitude = double.parse(widget.long!);
|
|
|
|
}
|
|
|
|
if (widget.lat != null && widget.lat != '' && widget.lat != 'null') {
|
|
|
|
latitude = double.parse(widget.lat!);
|
|
|
|
}
|
|
|
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
|
|
|
AMapInitializer.init(context, apiKey: ConstConfig.amapApiKeys);
|
|
|
|
AMapInitializer.updatePrivacyAgree(ConstConfig.amapPrivacyStatement);
|
|
|
|
|
|
|
|
AMapFlutterLocation.setApiKey("1dbf56e2e8a4d0e4cdc2df9efd36bc71",
|
|
|
|
"dfb64c0463cb53927914364b5c09aba0",
|
|
|
|
ohosKey: "7c2081e92ec65bfffa2df0a5464f0c7b");
|
|
|
|
|
|
|
|
/// 设置是否已经包含高德隐私政策并弹窗展示显示用户查看,如果未包含或者没有弹窗展示,高德定位SDK将不会工作
|
|
|
|
///
|
|
|
|
/// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
|
|
|
|
/// <b>必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意</b>
|
|
|
|
///
|
|
|
|
/// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
|
|
|
|
///
|
|
|
|
/// [hasContains] 隐私声明中是否包含高德隐私政策说明
|
|
|
|
///
|
|
|
|
/// [hasShow] 隐私权政策是否弹窗展示告知用户
|
|
|
|
AMapFlutterLocation.updatePrivacyShow(true, true);
|
|
|
|
|
|
|
|
/// 设置是否已经取得用户同意,如果未取得用户同意,高德定位SDK将不会工作
|
|
|
|
///
|
|
|
|
/// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
|
|
|
|
///
|
|
|
|
/// <b>必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意</b>
|
|
|
|
///
|
|
|
|
/// [hasAgree] 隐私权政策是否已经取得用户同意
|
|
|
|
AMapFlutterLocation.updatePrivacyAgree(true);
|
|
|
|
_requestLocationPermission();
|
|
|
|
|
|
|
|
// ama
|
|
|
|
// let marker = new AMap.Marker({//添加标记点
|
|
|
|
// position: this.position,
|
|
|
|
// map: map
|
|
|
|
});
|
|
|
|
|
|
|
|
_geocodeSearchListener = _locationPlugin
|
|
|
|
.onGeocodeSearchChange()
|
|
|
|
.listen((Map<String, Object> result) {
|
|
|
|
// setState(() {
|
|
|
|
|
|
|
|
if (result.containsKey('errorCode')) {
|
|
|
|
Utils.showToast(result['errorInfo'].toString());
|
|
|
|
} else {
|
|
|
|
_locationResult = result;
|
|
|
|
|
|
|
|
print(_locationResult);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/// 注册定位结果监听
|
|
|
|
/// 通过监听器接收定位结果并更新UI
|
|
|
|
_locationListener = _locationPlugin
|
|
|
|
.onLocationChanged()
|
|
|
|
.listen((Map<String, Object> result) {
|
|
|
|
// setState(() {
|
|
|
|
|
|
|
|
if (result.containsKey('errorCode')) {
|
|
|
|
Utils.showToast(result['errorInfo'].toString());
|
|
|
|
} else {
|
|
|
|
_locationResult = result;
|
|
|
|
|
|
|
|
print(_locationResult);
|
|
|
|
|
|
|
|
if (result['latitude'] == null || result['latitude'] == '') //网络不好,定位失败
|
|
|
|
{
|
|
|
|
// App.sp.setString("lat", "39.684670899");
|
|
|
|
// App.sp.setString("lng", "118.17630045");
|
|
|
|
} else {
|
|
|
|
if (widget.long == null ||
|
|
|
|
widget.long == '' ||
|
|
|
|
widget.long == 'null') {
|
|
|
|
latitude = double.parse(result['latitude'].toString());
|
|
|
|
longitude = double.parse(result['longitude'].toString());
|
|
|
|
// if (_mapController != null) {
|
|
|
|
_mapController.moveCamera(
|
|
|
|
CameraUpdate.newLatLng(LatLng(latitude, longitude)));
|
|
|
|
|
|
|
|
// }
|
|
|
|
page = 1;
|
|
|
|
|
|
|
|
// _loadData(LatLng(latitude, longitude));
|
|
|
|
|
|
|
|
// setState(() {});
|
|
|
|
}
|
|
|
|
latitudeLocation = latitude;
|
|
|
|
longitudeLocation = longitude;
|
|
|
|
_mapController.moveCamera(
|
|
|
|
CameraUpdate.newLatLng(LatLng(latitudeLocation, longitudeLocation)),
|
|
|
|
animated: true,
|
|
|
|
);
|
|
|
|
_loadData(LatLng(latitude, longitude));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
super.dispose();
|
|
|
|
|
|
|
|
/// 移除定位监听
|
|
|
|
/// 防止内存泄漏
|
|
|
|
if (null != _locationListener) {
|
|
|
|
_locationListener?.cancel();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (null != _geocodeSearchListener) {
|
|
|
|
_geocodeSearchListener?.cancel();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 销毁定位
|
|
|
|
/// 释放定位资源
|
|
|
|
_locationPlugin.destroy();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Future<bool> checkLocationPermission() async {
|
|
|
|
// PermissionStatus permissionStatus = await Permission.location.status;
|
|
|
|
// if (permissionStatus == PermissionStatus.granted) {
|
|
|
|
// return true;
|
|
|
|
// } else {
|
|
|
|
// return false;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
/// 检查权限并定
|
|
|
|
// _getLocationPermission() async {
|
|
|
|
// if (!(await checkPermission(Permission.location))) {
|
|
|
|
// //没有定位权限
|
|
|
|
|
|
|
|
// //申请定位权限
|
|
|
|
// _requestLocationPermission();
|
|
|
|
// } else {
|
|
|
|
// //去定位
|
|
|
|
// _requestLocationPermission();
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
/// 设置定位参数
|
|
|
|
/// 配置定位选项,如精度、频率等
|
|
|
|
void _setLocationOption() {
|
|
|
|
AMapLocationOption locationOption = new AMapLocationOption();
|
|
|
|
|
|
|
|
/// 是否单次定位
|
|
|
|
/// false表示连续定位
|
|
|
|
locationOption.onceLocation = true;
|
|
|
|
|
|
|
|
/// 是否需要返回逆地理信息
|
|
|
|
/// true表示需要返回地址信息
|
|
|
|
locationOption.needAddress = true;
|
|
|
|
|
|
|
|
/// 是否需要返回逆地理编码信息
|
|
|
|
locationOption.locatingWithReGeocode = true;
|
|
|
|
|
|
|
|
/// 逆地理信息的语言类型
|
|
|
|
/// 默认为自动适配当前系统语言
|
|
|
|
locationOption.geoLanguage = GeoLanguage.DEFAULT;
|
|
|
|
|
|
|
|
/// iOS 14定位精度权限设置
|
|
|
|
/// 设置为模糊定位精度
|
|
|
|
locationOption.desiredLocationAccuracyAuthorizationMode =
|
|
|
|
AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
|
|
|
|
|
|
|
|
/// iOS 14精确定位目的key
|
|
|
|
/// 需要与info.plist中配置一致
|
|
|
|
locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
|
|
|
|
|
|
|
|
/// 设置Android端连续定位的定位间隔
|
|
|
|
/// 单位:毫秒
|
|
|
|
locationOption.locationInterval = 2000;
|
|
|
|
|
|
|
|
/// 设置Android端的定位模式
|
|
|
|
/// 可选值:
|
|
|
|
/// [AMapLocationMode.Battery_Saving] 低功耗模式
|
|
|
|
/// [AMapLocationMode.Device_Sensors] 仅设备模式
|
|
|
|
/// [AMapLocationMode.Hight_Accuracy] 高精度模式
|
|
|
|
locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
|
|
|
|
|
|
|
|
/// 设置iOS端的定位最小更新距离
|
|
|
|
/// -1表示不限制距离
|
|
|
|
locationOption.distanceFilter = -1;
|
|
|
|
|
|
|
|
/// 设置iOS端期望的定位精度
|
|
|
|
/// 可选值:
|
|
|
|
/// [DesiredAccuracy.Best] 最高精度
|
|
|
|
/// [DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度
|
|
|
|
/// [DesiredAccuracy.NearestTenMeters] 10米
|
|
|
|
/// [DesiredAccuracy.Kilometer] 1000米
|
|
|
|
/// [DesiredAccuracy.ThreeKilometers] 3000米
|
|
|
|
locationOption.desiredAccuracy = DesiredAccuracy.Best;
|
|
|
|
|
|
|
|
/// 设置iOS端是否允许系统暂停定位
|
|
|
|
/// false表示不允许系统暂停定位
|
|
|
|
locationOption.pausesLocationUpdatesAutomatically = false;
|
|
|
|
|
|
|
|
/// 将定位参数设置给定位插件
|
|
|
|
_locationPlugin.setLocationOption(locationOption);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 获取定位权限
|
|
|
|
_requestLocationPermission() async {
|
|
|
|
/// [hasShow] 隐私权政策是否弹窗展示告知用户
|
|
|
|
AMapFlutterLocation.updatePrivacyShow(true, true);
|
|
|
|
|
|
|
|
/// [hasAgree] 隐私权政策是否已经取得用户同意
|
|
|
|
AMapFlutterLocation.updatePrivacyAgree(true);
|
|
|
|
// await AMapFlutterLocation.instance.updatePrivacyShow(true);
|
|
|
|
// await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
bool canLocation = false;
|
|
|
|
|
|
|
|
if (!(await checkPermission(Permission.location))) {
|
|
|
|
//没有定位权限
|
|
|
|
|
|
|
|
//申请定位权限
|
|
|
|
canLocation = await requestPermission(Permission.location);
|
|
|
|
} else {
|
|
|
|
canLocation = true;
|
|
|
|
}
|
|
|
|
// bool canLocation = await requestPermission(Permission.location);
|
|
|
|
// 单次定位
|
|
|
|
if (canLocation) {
|
|
|
|
Future.delayed(Duration(milliseconds: 200), () async {
|
|
|
|
/// [hasShow] 隐私权政策是否弹窗展示告知用户
|
|
|
|
AMapFlutterLocation.updatePrivacyShow(true, true);
|
|
|
|
|
|
|
|
/// [hasAgree] 隐私权政策是否已经取得用户同意
|
|
|
|
AMapFlutterLocation.updatePrivacyAgree(true);
|
|
|
|
_startLocation();
|
|
|
|
// final location = await AmapLocation.instance.fetchLocation(
|
|
|
|
// // needAddress: true,
|
|
|
|
// // mode: LocationAccuracy.High,
|
|
|
|
// // timeout: Duration(seconds: 10)
|
|
|
|
// );
|
|
|
|
|
|
|
|
// if (location.city == null || location.city == '') //网络不好,定位失败
|
|
|
|
// {
|
|
|
|
// // App.sp.setString("lat", "39.684670899");
|
|
|
|
// // App.sp.setString("lng", "118.17630045");
|
|
|
|
// } else {
|
|
|
|
// if (widget.long == null ||
|
|
|
|
// widget.long == '' ||
|
|
|
|
// widget.long == 'null') {
|
|
|
|
// latitude = location.latLng!.latitude;
|
|
|
|
// longitude = location.latLng!.longitude;
|
|
|
|
// if (_controller != null) {
|
|
|
|
// _controller!.setCenterCoordinate(LatLng(
|
|
|
|
// location.latLng!.latitude, location.latLng!.longitude));
|
|
|
|
// }
|
|
|
|
|
|
|
|
// page = 1;
|
|
|
|
|
|
|
|
// _loadData(
|
|
|
|
// LatLng(location.latLng!.latitude, location.latLng!.longitude));
|
|
|
|
|
|
|
|
// setState(() {});
|
|
|
|
// }
|
|
|
|
// latitudeLocation = location.latLng!.latitude;
|
|
|
|
// longitudeLocation = location.latLng!.longitude;
|
|
|
|
// }
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
//无权限
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 开始定位
|
|
|
|
/// 设置定位参数并启动定位
|
|
|
|
void _startLocation() {
|
|
|
|
/// 开始定位之前设置定位参数
|
|
|
|
_setLocationOption();
|
|
|
|
_locationPlugin.startLocation();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 停止定位
|
|
|
|
/// 停止定位服务
|
|
|
|
void _stopLocation() {
|
|
|
|
_locationPlugin.stopLocation();
|
|
|
|
}
|
|
|
|
|
|
|
|
void onMapCreated(AMapController controller) {
|
|
|
|
// setState(() {
|
|
|
|
_mapController = controller;
|
|
|
|
// _mapController.moveCamera(
|
|
|
|
// CameraUpdate.newLatLng(LatLng(latitudeLocation, longitudeLocation)),
|
|
|
|
// animated: true,
|
|
|
|
// );
|
|
|
|
// getApprovalNumber();
|
|
|
|
// });
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 获取审图号
|
|
|
|
// void getApprovalNumber() async {
|
|
|
|
// //普通地图审图号
|
|
|
|
// String mapContentApprovalNumber =
|
|
|
|
// (await _mapController.getMapContentApprovalNumber());
|
|
|
|
// //卫星地图审图号
|
|
|
|
// String satelliteImageApprovalNumber =
|
|
|
|
// (await _mapController.getSatelliteImageApprovalNumber());
|
|
|
|
|
|
|
|
// print('地图审图号(普通地图): $mapContentApprovalNumber');
|
|
|
|
// print('地图审图号(卫星地图): $satelliteImageApprovalNumber');
|
|
|
|
// }
|
|
|
|
|
|
|
|
//移动视野
|
|
|
|
// void _onCameraMove(CameraPosition cameraPosition) {
|
|
|
|
// latitude = cameraPosition.target.latitude;
|
|
|
|
// longitude = cameraPosition.target.longitude;
|
|
|
|
// page = 1;
|
|
|
|
// _loadData(cameraPosition.target);
|
|
|
|
// }
|
|
|
|
|
|
|
|
//移动地图结束
|
|
|
|
void _onCameraMoveEnd(CameraPosition cameraPosition) {
|
|
|
|
setState(() {
|
|
|
|
_currentZoom = '当前缩放级别:${cameraPosition.zoom}';
|
|
|
|
});
|
|
|
|
|
|
|
|
_mapController.moveCamera(
|
|
|
|
CameraUpdate.zoomTo(cameraPosition.zoom),
|
|
|
|
animated: true,
|
|
|
|
);
|
|
|
|
latitude = cameraPosition.target.latitude;
|
|
|
|
longitude = cameraPosition.target.longitude;
|
|
|
|
page = 1;
|
|
|
|
_loadData(cameraPosition.target);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
final AMapWidget amap = AMapWidget(
|
|
|
|
initialCameraPosition:
|
|
|
|
CameraPosition(target: LatLng(latitude, longitude), zoom: 16),
|
|
|
|
onMapCreated: onMapCreated,
|
|
|
|
// onCameraMove: _onCameraMove,
|
|
|
|
onCameraMoveEnd: _onCameraMoveEnd,
|
|
|
|
minMaxZoomPreference: MinMaxZoomPreference(_minZoom, _maxZoom),
|
|
|
|
scaleEnabled: true,
|
|
|
|
);
|
|
|
|
|
|
|
|
return Scaffold(
|
|
|
|
resizeToAvoidBottomInset: false, //防止底部布局被顶起
|
|
|
|
appBar: SystemAppBar(
|
|
|
|
'选择位置信息',
|
|
|
|
onTap: () {
|
|
|
|
if (Navigator.canPop(context)) {
|
|
|
|
Navigator.pop(context);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
),
|
|
|
|
|
|
|
|
body: Column(
|
|
|
|
children: <Widget>[
|
|
|
|
// Theme(
|
|
|
|
// data: new
|
|
|
|
// ThemeData(
|
|
|
|
// // primaryColor: MyColours.color_438E93,
|
|
|
|
// // hintColor: MyColours.color_438E93),
|
|
|
|
// child:
|
|
|
|
// Container(
|
|
|
|
// color: MyColours.color_438E93,
|
|
|
|
// decoration: BoxDecoration(
|
|
|
|
// color: MyColours.color_438E93,
|
|
|
|
// boxShadow: [
|
|
|
|
// BoxShadow(color: Colors.white, spreadRadius: 1),
|
|
|
|
// ],
|
|
|
|
// ),
|
|
|
|
|
|
|
|
// padding: EdgeInsets.all(5),
|
|
|
|
// child:
|
|
|
|
|
|
|
|
// ),
|
|
|
|
// ),
|
|
|
|
// ListView.builder(
|
|
|
|
// shrinkWrap: true,
|
|
|
|
// itemCount: inputTipDatas.length,
|
|
|
|
// itemBuilder: (context, index) {
|
|
|
|
// InputTip inputTip = inputTipDatas[index];
|
|
|
|
// return InkWell(
|
|
|
|
// onTap: () {
|
|
|
|
// // searchAroundAddress(inputTip.name ?? '');
|
|
|
|
// // searchPoiId(inputTip.poiId ?? '');
|
|
|
|
// // _loadData(inputTip.coordinate ??
|
|
|
|
// // LatLng(latitude, longitude));
|
|
|
|
// },
|
|
|
|
// child: Container(
|
|
|
|
// child: Row(
|
|
|
|
// children: [
|
|
|
|
// Text(
|
|
|
|
// inputTip.name ?? '',
|
|
|
|
// style: TextStyle(
|
|
|
|
// fontSize: font(15),
|
|
|
|
// color: MyColours.color_515151),
|
|
|
|
// ),
|
|
|
|
// HEmptyView(10),
|
|
|
|
// Expanded(
|
|
|
|
// child: Text(
|
|
|
|
// (inputTip.district ?? '') +
|
|
|
|
// (inputTip.address ?? ''),
|
|
|
|
// style: TextStyle(
|
|
|
|
// fontSize: font(13),
|
|
|
|
// color: MyColours.color_999999),
|
|
|
|
// ),
|
|
|
|
// ),
|
|
|
|
// ],
|
|
|
|
// )));
|
|
|
|
// })
|
|
|
|
// ],
|
|
|
|
// ),
|
|
|
|
|
|
|
|
Stack(
|
|
|
|
children: [
|
|
|
|
Container(
|
|
|
|
height: w(300),
|
|
|
|
child: Stack(
|
|
|
|
children: <Widget>[
|
|
|
|
amap,
|
|
|
|
// AmapView(
|
|
|
|
// showZoomControl: false,
|
|
|
|
|
|
|
|
// /// 是否显示指南针控件
|
|
|
|
// showCompass: true,
|
|
|
|
|
|
|
|
// /// 是否显示比例尺控件
|
|
|
|
// showScaleControl: true,
|
|
|
|
|
|
|
|
// /// 是否使能缩放手势
|
|
|
|
// zoomGesturesEnabled: true,
|
|
|
|
|
|
|
|
// /// 是否使能滚动手势
|
|
|
|
// scrollGesturesEnabled: true,
|
|
|
|
|
|
|
|
// /// 是否使能旋转手势
|
|
|
|
// rotateGestureEnabled: false,
|
|
|
|
// centerCoordinate: LatLng(latitude, longitude),
|
|
|
|
// maskDelay: Duration(milliseconds: 500),
|
|
|
|
// zoomLevel: 19,
|
|
|
|
// onMapCreated: (controller) async {
|
|
|
|
// _controller = controller;
|
|
|
|
// _controller!
|
|
|
|
// .setCenterCoordinate(LatLng(latitude, longitude));
|
|
|
|
// // if (await requestPermission(PermissionGroup.location)) {
|
|
|
|
// // await controller.showMyLocation(true);
|
|
|
|
// // await controller?.showLocateControl(true);
|
|
|
|
// // final latLng = await _controller?.getLocation(
|
|
|
|
// // delay: Duration(seconds: 2));
|
|
|
|
// // await enableFluttifyLog(false); // 关闭log
|
|
|
|
// // _loadData(latLng);
|
|
|
|
// // } else {
|
|
|
|
// // //无权限
|
|
|
|
// // _showLocPemWidget();
|
|
|
|
// // }
|
|
|
|
// },
|
|
|
|
// // markers: [],
|
|
|
|
// onMapMoveEnd: (MapMove move) async {
|
|
|
|
// latitude = move.coordinate!.latitude;
|
|
|
|
// longitude = move.coordinate!.longitude;
|
|
|
|
// page = 1;
|
|
|
|
// _loadData(move.coordinate!);
|
|
|
|
// },
|
|
|
|
// ),
|
|
|
|
Center(
|
|
|
|
child: Icon(
|
|
|
|
Icons.place,
|
|
|
|
size: w(32),
|
|
|
|
color: Color(0xFFFF0000),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Positioned(
|
|
|
|
right: w(10),
|
|
|
|
bottom: w(10),
|
|
|
|
child: InkWell(
|
|
|
|
onTap: () {
|
|
|
|
_mapController.moveCamera(
|
|
|
|
CameraUpdate.newLatLng(
|
|
|
|
LatLng(latitudeLocation, longitudeLocation)),
|
|
|
|
animated: true,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: MyColours.color_ffffff,
|
|
|
|
borderRadius: BorderRadius.circular(r(5))),
|
|
|
|
padding: EdgeInsets.all(w(5)),
|
|
|
|
child: Image.asset(
|
|
|
|
Utils.getImgPath('location_map'),
|
|
|
|
width: w(25),
|
|
|
|
),
|
|
|
|
)),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Positioned(
|
|
|
|
top: w(10),
|
|
|
|
left: w(20),
|
|
|
|
right: w(20),
|
|
|
|
child: Container(
|
|
|
|
// height: w(45),
|
|
|
|
padding: EdgeInsets.symmetric(vertical: w(10)),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Colors.white,
|
|
|
|
borderRadius: BorderRadius.circular(r(10))),
|
|
|
|
child: TextField(
|
|
|
|
textAlignVertical: TextAlignVertical.center,
|
|
|
|
style: TextStyle(
|
|
|
|
color: MyColours.color_515151,
|
|
|
|
fontSize: font(15),
|
|
|
|
),
|
|
|
|
controller:
|
|
|
|
TextEditingController.fromValue(TextEditingValue(
|
|
|
|
// 设置内容
|
|
|
|
text: keyword,
|
|
|
|
selection: TextSelection.fromPosition(TextPosition(
|
|
|
|
affinity: TextAffinity.downstream,
|
|
|
|
offset: keyword.length)),
|
|
|
|
// 保持光标在最后
|
|
|
|
)),
|
|
|
|
decoration: InputDecoration(
|
|
|
|
// border: b,
|
|
|
|
// border: OutlineInputBorder(
|
|
|
|
// borderRadius: BorderRadius.all(Radius.circular(40)),
|
|
|
|
// ),
|
|
|
|
border: OutlineInputBorder(borderSide: BorderSide.none),
|
|
|
|
hintText: '输入关键字',
|
|
|
|
isCollapsed: true,
|
|
|
|
|
|
|
|
hintStyle: TextStyle(
|
|
|
|
color: MyColours.color_999999, fontSize: font(15)),
|
|
|
|
// contentPadding: const EdgeInsets.symmetric(
|
|
|
|
// vertical: 8, horizontal: 1),
|
|
|
|
prefixIconConstraints: BoxConstraints(maxWidth: w(40)),
|
|
|
|
prefixIcon: Padding(
|
|
|
|
padding: EdgeInsets.only(left: w(10), right: w(10)),
|
|
|
|
child: SizedBox(
|
|
|
|
width: w(30),
|
|
|
|
child: Image.asset(
|
|
|
|
Utils.getImgPath('search_black'),
|
|
|
|
))),
|
|
|
|
suffixIconConstraints: BoxConstraints(maxWidth: w(32)),
|
|
|
|
suffixIcon: InkWell(
|
|
|
|
child: Padding(
|
|
|
|
padding: EdgeInsets.only(left: w(10), right: w(10)),
|
|
|
|
child: SizedBox(
|
|
|
|
width: w(22),
|
|
|
|
child: Image.asset(
|
|
|
|
Utils.getImgPath('delete_black'),
|
|
|
|
))),
|
|
|
|
onTap: () {
|
|
|
|
keyword = "";
|
|
|
|
setState(() {});
|
|
|
|
},
|
|
|
|
),
|
|
|
|
fillColor: Colors.white,
|
|
|
|
filled: true,
|
|
|
|
),
|
|
|
|
|
|
|
|
inputFormatters: [],
|
|
|
|
//内容改变的回调
|
|
|
|
onChanged: (text) {
|
|
|
|
print('change $text');
|
|
|
|
keyword = text;
|
|
|
|
|
|
|
|
//搜索
|
|
|
|
|
|
|
|
if (text != null && text.trim().length > 0) {
|
|
|
|
JhCommonUtils.debounce(
|
|
|
|
() => _fetchInputTips(text.toString()));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
//内容提交(按回车)的回调
|
|
|
|
onSubmitted: (text) {
|
|
|
|
print('submit $text');
|
|
|
|
// 触发关闭弹出来的键盘。
|
|
|
|
keyword = text;
|
|
|
|
FocusScope.of(context).requestFocus(FocusNode());
|
|
|
|
setState(() {
|
|
|
|
// isloading = true;
|
|
|
|
});
|
|
|
|
|
|
|
|
// _fetchInputTips(text.toString());
|
|
|
|
|
|
|
|
// searchAroundAddress(text.toString());
|
|
|
|
},
|
|
|
|
//按回车时调用
|
|
|
|
onEditingComplete: () {
|
|
|
|
print('onEditingComplete');
|
|
|
|
},
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
|
|
|
|
Expanded(
|
|
|
|
flex: 1,
|
|
|
|
child: Visibility(
|
|
|
|
visible: !isloading,
|
|
|
|
maintainSize: false,
|
|
|
|
maintainSemantics: false,
|
|
|
|
maintainInteractivity: false,
|
|
|
|
replacement: Center(
|
|
|
|
child: CupertinoActivityIndicator(),
|
|
|
|
),
|
|
|
|
child: EasyRefresh.custom(
|
|
|
|
controller: refreshController,
|
|
|
|
slivers: [
|
|
|
|
SliverList(
|
|
|
|
delegate: SliverChildBuilderDelegate(
|
|
|
|
(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,
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: 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(
|
|
|
|
// LatLng(item.latLng.latitude, item.latLng.longitude),
|
|
|
|
// zoomLevel: 16);
|
|
|
|
if (Navigator.canPop(context)) {
|
|
|
|
Navigator.pop(context, {
|
|
|
|
'address': item.address,
|
|
|
|
'lat': item.latLng!.latitude.toString(),
|
|
|
|
'lng': item.latLng!.longitude.toString()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
);
|
|
|
|
},
|
|
|
|
childCount: list.length,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
onRefresh: () async {
|
|
|
|
if (flag) {
|
|
|
|
page = 1;
|
|
|
|
_loadData(LatLng(latitude, longitude));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
onLoad: () async {
|
|
|
|
if (flag) {
|
|
|
|
page++;
|
|
|
|
_loadData(LatLng(latitude, longitude),
|
|
|
|
showloading: false);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
)),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
_fetchInputTips(String text) async {
|
|
|
|
flag = false;
|
|
|
|
page = 1;
|
|
|
|
// setState(() {
|
|
|
|
// isloading = true;
|
|
|
|
// });
|
|
|
|
|
|
|
|
/// 逆地理编码(坐标转地址)
|
|
|
|
///
|
|
|
|
///
|
|
|
|
// await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
|
|
|
|
LatLng latLng = LatLng(latitude, longitude);
|
|
|
|
|
|
|
|
address = await _locationPlugin
|
|
|
|
.onGeocodeSearch(true, [latLng.longitude, latLng.latitude]);
|
|
|
|
|
|
|
|
// await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
|
|
|
|
List<dynamic> temp = await _locationPlugin.doInputtipsRequest(
|
|
|
|
text,
|
|
|
|
city: "",
|
|
|
|
);
|
|
|
|
|
|
|
|
inputTipDatas = [];
|
|
|
|
|
|
|
|
temp.forEach((element) {
|
|
|
|
inputTipDatas.add(MapInputsModel.fromJson(element));
|
|
|
|
});
|
|
|
|
|
|
|
|
print(inputTipDatas);
|
|
|
|
poiModel = new PoiModel("当前位置", address, latLng);
|
|
|
|
list.clear();
|
|
|
|
list.add(poiModel);
|
|
|
|
for (var inputTip in inputTipDatas) {
|
|
|
|
String? title = await inputTip.name ?? '';
|
|
|
|
String? cityStr = (inputTip.district ?? '') + (inputTip.city ?? '');
|
|
|
|
|
|
|
|
// LatLng? latLng = await inputTip.point;
|
|
|
|
|
|
|
|
list.add(new PoiModel(title.toString(), cityStr, latLng));
|
|
|
|
}
|
|
|
|
|
|
|
|
print(list);
|
|
|
|
|
|
|
|
setState(() {
|
|
|
|
// isloading = false;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
void _loadData(LatLng latLng, {showloading = true}) async {
|
|
|
|
flag = true;
|
|
|
|
setState(() {
|
|
|
|
if (showloading) {
|
|
|
|
isloading = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/// 逆地理编码(坐标转地址)
|
|
|
|
///
|
|
|
|
///
|
|
|
|
///
|
|
|
|
|
|
|
|
// await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
if (page == 1) {
|
|
|
|
address = await _locationPlugin
|
|
|
|
.onGeocodeSearch(true, [latLng.longitude, latLng.latitude]);
|
|
|
|
poiModel = new PoiModel("当前位置", address, latLng);
|
|
|
|
list.clear();
|
|
|
|
list.add(poiModel);
|
|
|
|
}
|
|
|
|
// final poiList
|
|
|
|
List<dynamic> temp = await _locationPlugin.poiSearchAround(
|
|
|
|
keyword, latLng.longitude, latLng.latitude);
|
|
|
|
|
|
|
|
List<MapRoundSearchModel> searchData = [];
|
|
|
|
|
|
|
|
temp.forEach((element) {
|
|
|
|
searchData.add(MapRoundSearchModel.fromJson(element));
|
|
|
|
});
|
|
|
|
|
|
|
|
print(searchData);
|
|
|
|
|
|
|
|
for (var poi in searchData) {
|
|
|
|
String? title = await poi.title;
|
|
|
|
String? cityName = await poi.cityName;
|
|
|
|
String? provinceName = await poi.provinceName;
|
|
|
|
String? snippet = await poi.snippet;
|
|
|
|
String? adName = await poi.adName;
|
|
|
|
LatLng? latLng = LatLng(poi.latitude ?? 0, poi.longitude ?? 0);
|
|
|
|
String? bussniss = poi.businessArea;
|
|
|
|
|
|
|
|
list.add(new PoiModel(
|
|
|
|
title.toString(),
|
|
|
|
provinceName.toString() +
|
|
|
|
cityName.toString() +
|
|
|
|
adName.toString() +
|
|
|
|
// address.toString() +
|
|
|
|
bussniss.toString() +
|
|
|
|
snippet.toString(),
|
|
|
|
latLng));
|
|
|
|
}
|
|
|
|
|
|
|
|
setState(() {
|
|
|
|
if (showloading) {
|
|
|
|
isloading = false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// void searchPoiId(String text) async {
|
|
|
|
// await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
// Poi? poi = await AmapSearch.instance.searchPoiId(
|
|
|
|
// text,
|
|
|
|
// );
|
|
|
|
// print(poi);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// void searchAroundAddress(String text) async {
|
|
|
|
// await AmapLocation.instance.updatePrivacyShow(true);
|
|
|
|
// await AmapLocation.instance.updatePrivacyAgree(true);
|
|
|
|
// final poiList = await AmapSearch.instance.searchKeyword(
|
|
|
|
// text,
|
|
|
|
// city: "",
|
|
|
|
// );
|
|
|
|
// // final poiList = await AmapSearch.instance.searchAround(
|
|
|
|
// // LatLng(latitude, longitude),
|
|
|
|
// // city: "",
|
|
|
|
// // radius: 100000000000000
|
|
|
|
|
|
|
|
// // );
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
} |
...
|
...
|
|