common_point_select_address_controller.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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/sdk/map/map_helper.dart';
  9. import 'package:permission_handler/permission_handler.dart';
  10. import 'package:sliding_sheet2/sliding_sheet2.dart';
  11. import '../../../dialog/common_confirm_dialog_impl.dart';
  12. import '../../../dialog/location_permission_dialog.dart';
  13. import '../../../resource/string.gen.dart';
  14. import '../../../utils/permission_util.dart';
  15. import '../../../utils/toast_util.dart';
  16. @injectable
  17. class CommonPointSelectAddressController extends BaseController {
  18. final TextEditingController searchEditController = TextEditingController();
  19. final FocusNode searchFocusNode = FocusNode();
  20. final mapController = MapController.create();
  21. final SheetController sheetController = SheetController();
  22. final RxDouble _commonPointRange = RxDouble(200);
  23. double get commonPointRange => _commonPointRange.value;
  24. final RxDouble _sheetProgress = 0.0.obs;
  25. double get sheetProgress => _sheetProgress.value;
  26. bool _isRangeChanging = false;
  27. bool _isFirstMoveCamera = true;
  28. final MapPadding mapPadding =
  29. MapPadding(top: 80, left: 80, right: 80, bottom: 80);
  30. final CircleOptions circleOptions = CircleOptions(
  31. fillColor: '#4D7B7DFF', strokeWidth: 2.w, strokeColor: '#92AEE6');
  32. @override
  33. void onReady() {
  34. super.onReady();
  35. _updateCurrentLocation();
  36. mapController.setOnCameraChangeListener(
  37. (camera) {
  38. if (_isRangeChanging) {
  39. return;
  40. }
  41. if (camera.function == CameraChangeType.onCameraChange) {
  42. //暂时隐藏范围
  43. if (circleOptions.visible == true) {
  44. circleOptions.visible = false;
  45. _updateOrAddCircle();
  46. }
  47. } else {
  48. circleOptions
  49. ..radius = commonPointRange
  50. ..longitude = camera.position.longitude
  51. ..visible = true
  52. ..latitude = camera.position.latitude;
  53. _updateOrAddCircle();
  54. if (_isFirstMoveCamera) {
  55. _isFirstMoveCamera = false;
  56. _moveCameraToBounds();
  57. }
  58. }
  59. },
  60. );
  61. }
  62. void _updateOrAddCircle() {
  63. mapController.updateOrAddCircle('DC', circleOptions);
  64. }
  65. void backClick() {
  66. if (sheetController.state?.isExpanded == true) {
  67. sheetController.snapToExtent(0,
  68. duration: const Duration(milliseconds: 250));
  69. return;
  70. }
  71. Get.back();
  72. }
  73. void setCommonPointRange(double value) {
  74. _commonPointRange.value = value;
  75. circleOptions.radius = value;
  76. if (circleOptions.visible == true) {
  77. _updateOrAddCircle();
  78. _moveCameraToBounds();
  79. }
  80. }
  81. _moveCameraToBounds() {
  82. final latLngBounds = CameraUpdateUtil.getBounds(circleOptions.latitude,
  83. circleOptions.longitude, circleOptions.radius ?? 0);
  84. if (latLngBounds != null) {
  85. mapController.moveCameraToBounds(latLngBounds, mapPadding: mapPadding);
  86. }
  87. }
  88. setSheetProgress(double progress) {
  89. _sheetProgress.value = progress;
  90. if (progress == 1) {
  91. _requestFocus();
  92. }
  93. }
  94. void onOpenSearchAddressModel() async {
  95. if (sheetProgress == 0) {
  96. _setExpand();
  97. }
  98. }
  99. void _setExpand() async {
  100. await sheetController.snapToExtent(1,
  101. duration: const Duration(milliseconds: 250));
  102. _requestFocus();
  103. }
  104. void _requestFocus() async {
  105. if (searchFocusNode.hasFocus) {
  106. return;
  107. }
  108. //获取焦点
  109. await Future.delayed(Duration(milliseconds: 150));
  110. searchFocusNode.requestFocus();
  111. }
  112. void setCommonPointRangeStart() {
  113. _isRangeChanging = true;
  114. }
  115. void setCommonPointRangeEnd() {
  116. _isRangeChanging = false;
  117. }
  118. void moveToCurrentLocation() async {
  119. //权限检查
  120. bool isGranted = await PermissionUtil.checkLocationPermission();
  121. if (!isGranted) {
  122. LocationPermissionDialog.show(onNextStep: _requestLocationPermission);
  123. } else {
  124. _updateCurrentLocation();
  125. }
  126. }
  127. void _updateCurrentLocation() {
  128. var lastLocation = MapHelper.getLastLocation();
  129. if (lastLocation == null) {
  130. locationListener(MapLocation location) {
  131. MapHelper.removeLocationListener(locationListener);
  132. _showCurrentRange(location);
  133. }
  134. MapHelper.addLocationListener(locationListener);
  135. } else {
  136. _showCurrentRange(lastLocation);
  137. }
  138. }
  139. void _showCurrentRange(MapLocation location) {
  140. circleOptions.latitude = location.latitude;
  141. circleOptions.longitude = location.longitude;
  142. _moveCameraToBounds();
  143. }
  144. void _requestLocationPermission() async {
  145. bool isGranted = await PermissionUtil.requestLocationPermission();
  146. if (isGranted) {
  147. _showLocationAlways();
  148. _updateCurrentLocation();
  149. } else {
  150. permissionRefuseDialog(settingClick: () {
  151. openAppSettings();
  152. });
  153. ToastUtil.show(StringName.permissionRequestFail);
  154. }
  155. }
  156. void _showLocationAlways() async {
  157. bool isGranted = await PermissionUtil.checkShowLocationAlways();
  158. if (!isGranted) {
  159. LocationAlwaysPermissionDialog.show(onNextStep: () async {
  160. isGranted = await PermissionUtil.requestShowLocationAlways();
  161. if (isGranted) {
  162. _updateCurrentLocation();
  163. }
  164. });
  165. }
  166. }
  167. }