common_point_select_address_controller.dart 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter_map/flutter_map.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:get/get.dart';
  5. import 'package:get/get_core/src/get_main.dart';
  6. import 'package:injectable/injectable.dart';
  7. import 'package:location/base/base_controller.dart';
  8. import 'package:location/data/repositories/account_repository.dart';
  9. import 'package:location/handler/error_handler.dart';
  10. import 'package:location/sdk/map/map_helper.dart';
  11. import 'package:location/utils/atmob_log.dart';
  12. import 'package:permission_handler/permission_handler.dart';
  13. import 'package:pull_to_refresh/pull_to_refresh.dart';
  14. import 'package:sliding_sheet2/sliding_sheet2.dart';
  15. import '../../../data/bean/user_info.dart';
  16. import '../../../dialog/common_confirm_dialog_impl.dart';
  17. import '../../../dialog/location_permission_dialog.dart';
  18. import '../../../resource/string.gen.dart';
  19. import '../../../utils/de_bounce.dart';
  20. import '../../../utils/permission_util.dart';
  21. import '../../../utils/toast_util.dart';
  22. @injectable
  23. class CommonPointSelectAddressController extends BaseController {
  24. final TextEditingController searchEditController = TextEditingController();
  25. final FocusNode searchFocusNode = FocusNode();
  26. final mapController = MapController.create();
  27. final SheetController sheetController = SheetController();
  28. final RxDouble _commonPointRange = RxDouble(200);
  29. double get commonPointRange => _commonPointRange.value;
  30. final RxDouble _sheetProgress = 0.0.obs;
  31. double get sheetProgress => _sheetProgress.value;
  32. bool _isRangeChanging = false;
  33. bool _isFirstMoveCamera = true;
  34. UserInfo get mineUserInfo => accountRepository.mineUserInfo.value;
  35. RxList<PoiItem> poiList = RxList();
  36. final refreshController = RefreshController(initialRefresh: false);
  37. final Debounce _searchDebounce = Debounce(debounceTime: 500);
  38. final AccountRepository accountRepository;
  39. CommonPointSelectAddressController(this.accountRepository);
  40. final MapPadding mapPadding =
  41. MapPadding(top: 80, left: 80, right: 80, bottom: 80);
  42. final CircleOptions circleOptions = CircleOptions(
  43. fillColor: '#4D7B7DFF', strokeWidth: 2.w, strokeColor: '#92AEE6');
  44. final PoiQuery _poiQuery = PoiQuery();
  45. final int _pageSize = 20;
  46. int _pageNum = 1;
  47. @override
  48. void onReady() {
  49. super.onReady();
  50. _updateCurrentLocation();
  51. mapController.setOnCameraChangeListener(
  52. (camera) {
  53. if (_isRangeChanging) {
  54. return;
  55. }
  56. if (camera.function == CameraChangeType.onCameraChange) {
  57. //暂时隐藏范围
  58. if (circleOptions.visible == true) {
  59. circleOptions.visible = false;
  60. _updateOrAddCircle();
  61. }
  62. } else {
  63. circleOptions
  64. ..radius = commonPointRange
  65. ..longitude = camera.position.longitude
  66. ..visible = true
  67. ..latitude = camera.position.latitude;
  68. _updateOrAddCircle();
  69. if (_isFirstMoveCamera) {
  70. _isFirstMoveCamera = false;
  71. _moveCameraToBounds();
  72. }
  73. //重新还原数据
  74. _resetPoiQuery();
  75. _poiSearch();
  76. }
  77. },
  78. );
  79. }
  80. void _resetPoiQuery() {
  81. _pageNum = 1;
  82. }
  83. void _poiSearch() async {
  84. _searchDebounce.onClick(() {
  85. AtmobLog.d('zk', '_poiSearch: $_poiQuery');
  86. FlutterMap.paginatePoiSearch(
  87. pageNum: _pageNum,
  88. pageSize: _pageSize,
  89. query: _poiQuery,
  90. bound: PoiSearchBound.circle(
  91. center: LatLng(
  92. latitude: circleOptions.latitude,
  93. longitude: circleOptions.longitude),
  94. radius: circleOptions.radius?.toInt()))
  95. .then((list) {
  96. if (_pageNum == 1) {
  97. poiList.clear();
  98. }
  99. if (list != null && list.isNotEmpty) {
  100. poiList.addAll(list);
  101. refreshController.loadComplete();
  102. }
  103. if (list == null || list.length < _pageSize) {
  104. refreshController.loadNoData();
  105. }
  106. }).catchError((error) {
  107. ErrorHandler.toastError(error);
  108. refreshController.loadFailed();
  109. });
  110. });
  111. }
  112. void _updateOrAddCircle() {
  113. mapController.updateOrAddCircle('DC', circleOptions);
  114. }
  115. void backClick() {
  116. if (sheetController.state?.isExpanded == true) {
  117. sheetController.snapToExtent(0,
  118. duration: const Duration(milliseconds: 250));
  119. return;
  120. }
  121. Get.back();
  122. }
  123. void setCommonPointRange(double value) {
  124. _commonPointRange.value = value;
  125. circleOptions.radius = value;
  126. if (circleOptions.visible == true) {
  127. _updateOrAddCircle();
  128. _moveCameraToBounds();
  129. }
  130. }
  131. _moveCameraToBounds() {
  132. final latLngBounds = CameraUpdateUtil.getBounds(circleOptions.latitude,
  133. circleOptions.longitude, circleOptions.radius ?? 0);
  134. if (latLngBounds != null) {
  135. mapController.moveCameraToBounds(latLngBounds, mapPadding: mapPadding);
  136. }
  137. }
  138. setSheetProgress(double progress) {
  139. _sheetProgress.value = progress;
  140. if (progress == 1) {
  141. // _requestFocus();
  142. }
  143. }
  144. void onOpenSearchAddressModel() async {
  145. if (sheetProgress == 0) {
  146. _setExpand();
  147. }
  148. }
  149. void _setExpand() async {
  150. await sheetController.snapToExtent(1,
  151. duration: const Duration(milliseconds: 250));
  152. _requestFocus();
  153. }
  154. void _requestFocus() async {
  155. if (searchFocusNode.hasFocus) {
  156. return;
  157. }
  158. //获取焦点
  159. await Future.delayed(Duration(milliseconds: 150));
  160. searchFocusNode.requestFocus();
  161. }
  162. void setCommonPointRangeStart() {
  163. _isRangeChanging = true;
  164. }
  165. void setCommonPointRangeEnd() {
  166. _isRangeChanging = false;
  167. }
  168. void moveToCurrentLocation() async {
  169. //权限检查
  170. bool isGranted = await PermissionUtil.checkLocationPermission();
  171. if (!isGranted) {
  172. LocationPermissionDialog.show(onNextStep: _requestLocationPermission);
  173. } else {
  174. _updateCurrentLocation();
  175. }
  176. }
  177. void _updateCurrentLocation() {
  178. var lastLocation = MapHelper.getLastLocation();
  179. if (lastLocation == null) {
  180. locationListener(MapLocation location) {
  181. MapHelper.removeLocationListener(locationListener);
  182. _showCurrentRange(location);
  183. }
  184. MapHelper.addLocationListener(locationListener);
  185. } else {
  186. _showCurrentRange(lastLocation);
  187. }
  188. }
  189. void _showCurrentRange(MapLocation location) {
  190. circleOptions.latitude = location.latitude;
  191. circleOptions.longitude = location.longitude;
  192. _moveCameraToBounds();
  193. }
  194. void _requestLocationPermission() async {
  195. bool isGranted = await PermissionUtil.requestLocationPermission();
  196. if (isGranted) {
  197. _showLocationAlways();
  198. _updateCurrentLocation();
  199. } else {
  200. permissionRefuseDialog(settingClick: () {
  201. openAppSettings();
  202. });
  203. ToastUtil.show(StringName.permissionRequestFail);
  204. }
  205. }
  206. void _showLocationAlways() async {
  207. bool isGranted = await PermissionUtil.checkShowLocationAlways();
  208. if (!isGranted) {
  209. LocationAlwaysPermissionDialog.show(onNextStep: () async {
  210. isGranted = await PermissionUtil.requestShowLocationAlways();
  211. if (isGranted) {
  212. _updateCurrentLocation();
  213. }
  214. });
  215. }
  216. }
  217. onPoiItemClick(PoiItem item) {}
  218. void onLoadMorePoiData() {
  219. _pageNum++;
  220. _poiSearch();
  221. }
  222. }