import 'package:get/get.dart'; import 'package:get/get_rx/src/rx_types/rx_types.dart'; import 'package:injectable/injectable.dart'; import 'package:location/base/base_controller.dart'; import 'package:location/data/bean/location_info.dart'; import 'package:location/data/bean/user_info.dart'; import 'package:location/data/repositories/account_repository.dart'; import 'package:location/data/repositories/friends_repository.dart'; import 'package:flutter_map/flutter_map.dart'; import '../../dialog/add_friend_dialog.dart'; import '../../dialog/check_loation_permission_dialog.dart'; import '../../dialog/location_permission_dialog.dart'; import '../../utils/location_permission_util.dart'; import '../add_friend/add_friend_page.dart'; import '../mine/mine_page.dart'; @injectable class MainController extends BaseController { final FriendsRepository friendsRepository; final AccountRepository accountRepository; RxList get friendsList => friendsRepository.friendsList; UserInfo get mineLocation => accountRepository.locationUserInfo.value; MainController(this.friendsRepository, this.accountRepository); final Rxn _selectedFriend = Rxn(); UserInfo? get selectedFriend => _selectedFriend.value; final MapController mapController = MapController(); @override void onReady() { super.onReady(); friendsList.listen((list) { mapController.addMarkers(_convertToMarker(list)); }); AddFriendDialog.show( onAddClick: () async { await onAddFriendClick(); checkLocationPermissionCallback(); }, onNotAddDismiss: checkLocationPermissionCallback); } Future onAddFriendClick() { return AddFriendPage.show(); } void onMineClick() { MinePage.start(); } void checkLocationPermissionCallback() async { bool isGranted = await LocationPermissionUtil.checkLocationPermission(); if (!isGranted) { CheckLocationPermissionDialog.show( onRequestPermissionClick: _requestLocationPermission); } } void onSelectClick(UserInfo mineLocation) { UserInfo? oldInfo = _selectedFriend.value; _selectedFriend.value = mineLocation; //修改地图选中 _updateMapSelected(oldInfo, mineLocation); //移动到选中的位置 animateCamera(mineLocation); } void _updateMapSelected(UserInfo? oldInfo, UserInfo newInfo) { List markers = []; if (oldInfo != null) { markers.add(oldInfo); } markers.add(newInfo); mapController.updateMarkers(_convertToMarker(markers)); } void animateCamera(UserInfo userInfo) { LocationInfo? locationInfo = userInfo.lastLocation; if (locationInfo == null || locationInfo.longitude == 0 || locationInfo.latitude == 0) { return; } mapController.animateCamera(CameraPosition( longitude: locationInfo.longitude, latitude: locationInfo.latitude, zoom: 18)); } List _convertToMarker(List list) { return list .map((e) => Marker( id: e.id, markerName: e.remark ?? e.phoneNumber, longitude: e.lastLocation?.longitude, latitude: e.lastLocation?.latitude, markerType: MarkerType.friend, isSelected: e == _selectedFriend.value, )) .toList(); } void onMarkerTap(Marker marker) { String id = marker.id; UserInfo? userInfo = friendsList.firstWhereOrNull((element) => element.id == id); if (userInfo == null) { return; } onSelectClick(userInfo); } void onCurrentLocationClick() async { //权限检查 bool isGranted = await LocationPermissionUtil.checkLocationPermission(); if (!isGranted) { LocationPermissionDialog.show(onNextStep: _requestLocationPermission); } else { _updateCurrentLocation(); } } void _requestLocationPermission() async { bool isGranted = await LocationPermissionUtil.requestLocationPermission(); _showLocationAlways(); if (isGranted) { _updateCurrentLocation(); } } void _showLocationAlways() async { bool isGranted = await LocationPermissionUtil.checkShowLocationAlways(); if (!isGranted) { LocationAlwaysPermissionDialog.show(onNextStep: () async { isGranted = await LocationPermissionUtil.requestShowLocationAlways(); if (isGranted) { _updateCurrentLocation(); } }); } } void _updateCurrentLocation() {} }