| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- 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<UserInfo> get friendsList => friendsRepository.friendsList;
- UserInfo get mineLocation => accountRepository.locationUserInfo.value;
- MainController(this.friendsRepository, this.accountRepository);
- final Rxn<UserInfo> _selectedFriend = Rxn<UserInfo>();
- 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<void> 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<UserInfo> 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<Marker> _convertToMarker(List<UserInfo> 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() {}
- }
|