| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- import 'package:flutter/cupertino.dart';
- import 'package:flutter_map/flutter_map.dart';
- import 'package:flutter_screenutil/flutter_screenutil.dart';
- import 'package:get/get.dart';
- import 'package:get/get_core/src/get_main.dart';
- import 'package:injectable/injectable.dart';
- import 'package:location/base/base_controller.dart';
- import 'package:location/sdk/map/map_helper.dart';
- import 'package:permission_handler/permission_handler.dart';
- import 'package:sliding_sheet2/sliding_sheet2.dart';
- import '../../../dialog/common_confirm_dialog_impl.dart';
- import '../../../dialog/location_permission_dialog.dart';
- import '../../../resource/string.gen.dart';
- import '../../../utils/permission_util.dart';
- import '../../../utils/toast_util.dart';
- @injectable
- class CommonPointSelectAddressController extends BaseController {
- final TextEditingController searchEditController = TextEditingController();
- final FocusNode searchFocusNode = FocusNode();
- final mapController = MapController.create();
- final SheetController sheetController = SheetController();
- final RxDouble _commonPointRange = RxDouble(200);
- double get commonPointRange => _commonPointRange.value;
- final RxDouble _sheetProgress = 0.0.obs;
- double get sheetProgress => _sheetProgress.value;
- bool _isRangeChanging = false;
- bool _isFirstMoveCamera = true;
- final MapPadding mapPadding =
- MapPadding(top: 80, left: 80, right: 80, bottom: 80);
- final CircleOptions circleOptions = CircleOptions(
- fillColor: '#4D7B7DFF', strokeWidth: 2.w, strokeColor: '#92AEE6');
- @override
- void onReady() {
- super.onReady();
- _updateCurrentLocation();
- mapController.setOnCameraChangeListener(
- (camera) {
- if (_isRangeChanging) {
- return;
- }
- if (camera.function == CameraChangeType.onCameraChange) {
- //暂时隐藏范围
- if (circleOptions.visible == true) {
- circleOptions.visible = false;
- _updateOrAddCircle();
- }
- } else {
- circleOptions
- ..radius = commonPointRange
- ..longitude = camera.position.longitude
- ..visible = true
- ..latitude = camera.position.latitude;
- _updateOrAddCircle();
- if (_isFirstMoveCamera) {
- _isFirstMoveCamera = false;
- _moveCameraToBounds();
- }
- }
- },
- );
- }
- void _updateOrAddCircle() {
- mapController.updateOrAddCircle('DC', circleOptions);
- }
- void backClick() {
- if (sheetController.state?.isExpanded == true) {
- sheetController.snapToExtent(0,
- duration: const Duration(milliseconds: 250));
- return;
- }
- Get.back();
- }
- void setCommonPointRange(double value) {
- _commonPointRange.value = value;
- circleOptions.radius = value;
- if (circleOptions.visible == true) {
- _updateOrAddCircle();
- _moveCameraToBounds();
- }
- }
- _moveCameraToBounds() {
- final latLngBounds = CameraUpdateUtil.getBounds(circleOptions.latitude,
- circleOptions.longitude, circleOptions.radius ?? 0);
- if (latLngBounds != null) {
- mapController.moveCameraToBounds(latLngBounds, mapPadding: mapPadding);
- }
- }
- setSheetProgress(double progress) {
- _sheetProgress.value = progress;
- if (progress == 1) {
- _requestFocus();
- }
- }
- void onOpenSearchAddressModel() async {
- if (sheetProgress == 0) {
- _setExpand();
- }
- }
- void _setExpand() async {
- await sheetController.snapToExtent(1,
- duration: const Duration(milliseconds: 250));
- _requestFocus();
- }
- void _requestFocus() async {
- if (searchFocusNode.hasFocus) {
- return;
- }
- //获取焦点
- await Future.delayed(Duration(milliseconds: 150));
- searchFocusNode.requestFocus();
- }
- void setCommonPointRangeStart() {
- _isRangeChanging = true;
- }
- void setCommonPointRangeEnd() {
- _isRangeChanging = false;
- }
- void moveToCurrentLocation() async {
- //权限检查
- bool isGranted = await PermissionUtil.checkLocationPermission();
- if (!isGranted) {
- LocationPermissionDialog.show(onNextStep: _requestLocationPermission);
- } else {
- _updateCurrentLocation();
- }
- }
- void _updateCurrentLocation() {
- var lastLocation = MapHelper.getLastLocation();
- if (lastLocation == null) {
- locationListener(MapLocation location) {
- MapHelper.removeLocationListener(locationListener);
- _showCurrentRange(location);
- }
- MapHelper.addLocationListener(locationListener);
- } else {
- _showCurrentRange(lastLocation);
- }
- }
- void _showCurrentRange(MapLocation location) {
- circleOptions.latitude = location.latitude;
- circleOptions.longitude = location.longitude;
- _moveCameraToBounds();
- }
- void _requestLocationPermission() async {
- bool isGranted = await PermissionUtil.requestLocationPermission();
- if (isGranted) {
- _showLocationAlways();
- _updateCurrentLocation();
- } else {
- permissionRefuseDialog(settingClick: () {
- openAppSettings();
- });
- ToastUtil.show(StringName.permissionRequestFail);
- }
- }
- void _showLocationAlways() async {
- bool isGranted = await PermissionUtil.checkShowLocationAlways();
- if (!isGranted) {
- LocationAlwaysPermissionDialog.show(onNextStep: () async {
- isGranted = await PermissionUtil.requestShowLocationAlways();
- if (isGranted) {
- _updateCurrentLocation();
- }
- });
- }
- }
- }
|