main_controller.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import 'dart:io';
  2. import 'package:get/get.dart';
  3. import 'package:get/get_rx/src/rx_types/rx_types.dart';
  4. import 'package:injectable/injectable.dart';
  5. import 'package:location/base/base_controller.dart';
  6. import 'package:location/data/bean/location_info.dart';
  7. import 'package:location/data/bean/user_info.dart';
  8. import 'package:location/data/repositories/account_repository.dart';
  9. import 'package:location/data/repositories/friends_repository.dart';
  10. import 'package:location/utils/atmob_log.dart';
  11. import 'package:map/flutter_map.dart';
  12. import 'package:map_platform_interface/map_interface.dart';
  13. import '../../dialog/location_permission_dialog.dart';
  14. import '../../utils/location_permission_util.dart';
  15. import '../add_friend/add_friend_view.dart';
  16. import '../mine/mine_page.dart';
  17. @injectable
  18. class MainController extends BaseController {
  19. final FriendsRepository friendsRepository;
  20. final AccountRepository accountRepository;
  21. RxList<UserInfo> get friendsList => friendsRepository.friendsList;
  22. UserInfo get mineLocation => accountRepository.locationUserInfo.value;
  23. MainController(this.friendsRepository, this.accountRepository);
  24. final Rxn<UserInfo> _selectedFriend = Rxn<UserInfo>();
  25. UserInfo? get selectedFriend => _selectedFriend.value;
  26. final MapController mapController = MapController();
  27. @override
  28. void onReady() {
  29. super.onReady();
  30. friendsList.listen((list) {
  31. mapController.addMarkers(_convertToMarker(list));
  32. });
  33. }
  34. void onAddFriendClick() {
  35. AddFriendView.show();
  36. }
  37. void onMineClick() {
  38. MinePage.start();
  39. }
  40. void onSelectClick(UserInfo mineLocation) {
  41. UserInfo? oldInfo = _selectedFriend.value;
  42. _selectedFriend.value = mineLocation;
  43. //修改地图选中
  44. _updateMapSelected(oldInfo, mineLocation);
  45. //移动到选中的位置
  46. animateCamera(mineLocation);
  47. }
  48. void _updateMapSelected(UserInfo? oldInfo, UserInfo newInfo) {
  49. List<UserInfo> markers = [];
  50. if (oldInfo != null) {
  51. markers.add(oldInfo);
  52. }
  53. markers.add(newInfo);
  54. mapController.updateMarkers(_convertToMarker(markers));
  55. }
  56. void animateCamera(UserInfo userInfo) {
  57. LocationInfo? locationInfo = userInfo.lastLocation;
  58. if (locationInfo == null ||
  59. locationInfo.longitude == 0 ||
  60. locationInfo.latitude == 0) {
  61. return;
  62. }
  63. mapController.animateCamera(CameraPosition(
  64. longitude: locationInfo.longitude,
  65. latitude: locationInfo.latitude,
  66. zoom: 18));
  67. }
  68. List<Marker> _convertToMarker(List<UserInfo> list) {
  69. return list
  70. .map((e) => Marker(
  71. id: e.id,
  72. markerName: e.remark ?? e.phoneNumber,
  73. longitude: e.lastLocation?.longitude,
  74. latitude: e.lastLocation?.latitude,
  75. markerType: MarkerType.friend,
  76. isSelected: e == _selectedFriend.value,
  77. ))
  78. .toList();
  79. }
  80. void onMarkerTap(Marker marker) {
  81. String id = marker.id;
  82. UserInfo? userInfo =
  83. friendsList.firstWhereOrNull((element) => element.id == id);
  84. if (userInfo == null) {
  85. return;
  86. }
  87. onSelectClick(userInfo);
  88. }
  89. void onCurrentLocationClick() async {
  90. //权限检查
  91. bool isGranted = await LocationPermissionUtil.checkLocationPermission();
  92. if (!isGranted) {
  93. LocationPermissionDialog.show(onNextStep: () async {
  94. isGranted = await LocationPermissionUtil.requestLocationPermission();
  95. _showLocationAlways();
  96. if (isGranted) {
  97. _updateCurrentLocation();
  98. }
  99. });
  100. } else {
  101. _updateCurrentLocation();
  102. }
  103. }
  104. void _showLocationAlways() async {
  105. bool isGranted = await LocationPermissionUtil.checkShowLocationAlways();
  106. if (!isGranted) {
  107. LocationAlwaysPermissionDialog.show(onNextStep: () async {
  108. isGranted = await LocationPermissionUtil.requestShowLocationAlways();
  109. if (isGranted) {
  110. _updateCurrentLocation();
  111. }
  112. });
  113. }
  114. }
  115. void _updateCurrentLocation() {}
  116. }