|
|
@@ -1,15 +1,22 @@
|
|
|
+import 'dart:async';
|
|
|
+
|
|
|
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/consts/constants.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 'package:location/sdk/map/map_helper.dart';
|
|
|
+import 'package:location/utils/atmob_log.dart';
|
|
|
+import 'package:location/utils/base_expand.dart';
|
|
|
import '../../dialog/add_friend_dialog.dart';
|
|
|
import '../../dialog/check_loation_permission_dialog.dart';
|
|
|
import '../../dialog/location_permission_dialog.dart';
|
|
|
+import '../../utils/location_convert_marker_util.dart';
|
|
|
import '../../utils/location_permission_util.dart';
|
|
|
import '../add_friend/add_friend_page.dart';
|
|
|
import '../mine/mine_page.dart';
|
|
|
@@ -21,7 +28,7 @@ class MainController extends BaseController {
|
|
|
|
|
|
RxList<UserInfo> get friendsList => friendsRepository.friendsList;
|
|
|
|
|
|
- UserInfo get mineLocation => accountRepository.locationUserInfo.value;
|
|
|
+ UserInfo get mineUserInfo => accountRepository.mineUserInfo.value;
|
|
|
|
|
|
MainController(this.friendsRepository, this.accountRepository);
|
|
|
|
|
|
@@ -31,11 +38,16 @@ class MainController extends BaseController {
|
|
|
|
|
|
final MapController mapController = MapController();
|
|
|
|
|
|
+ StreamSubscription? mineLocationSubscription;
|
|
|
+
|
|
|
+ bool isFirstShowMineLocation = true;
|
|
|
+
|
|
|
@override
|
|
|
void onReady() {
|
|
|
super.onReady();
|
|
|
friendsList.listen((list) {
|
|
|
- mapController.addMarkers(_convertToMarker(list));
|
|
|
+ mapController.addMarkers(
|
|
|
+ Location2MarkerUtil.userInfoList2MarkerList(list, selectedFriend));
|
|
|
});
|
|
|
AddFriendDialog.show(
|
|
|
onAddClick: () async {
|
|
|
@@ -43,6 +55,16 @@ class MainController extends BaseController {
|
|
|
checkLocationPermissionCallback();
|
|
|
},
|
|
|
onNotAddDismiss: checkLocationPermissionCallback);
|
|
|
+ mineLocationSubscription =
|
|
|
+ accountRepository.mineUserInfo.value.lastLocation.listen((location) {
|
|
|
+ final mineInfo = accountRepository.mineUserInfo.value;
|
|
|
+ mapController.updateMarker(Location2MarkerUtil.userInfo2Marker(
|
|
|
+ mineInfo, selectedFriend == mineInfo));
|
|
|
+ if (isFirstShowMineLocation && location != null) {
|
|
|
+ isFirstShowMineLocation = false;
|
|
|
+ animateCameraToUser(mineInfo);
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
Future<void> onAddFriendClick() {
|
|
|
@@ -67,7 +89,7 @@ class MainController extends BaseController {
|
|
|
//修改地图选中
|
|
|
_updateMapSelected(oldInfo, mineLocation);
|
|
|
//移动到选中的位置
|
|
|
- animateCamera(mineLocation);
|
|
|
+ animateCameraToUser(mineLocation);
|
|
|
}
|
|
|
|
|
|
void _updateMapSelected(UserInfo? oldInfo, UserInfo newInfo) {
|
|
|
@@ -76,37 +98,34 @@ class MainController extends BaseController {
|
|
|
markers.add(oldInfo);
|
|
|
}
|
|
|
markers.add(newInfo);
|
|
|
- mapController.updateMarkers(_convertToMarker(markers));
|
|
|
+ mapController.updateMarkers(
|
|
|
+ Location2MarkerUtil.userInfoList2MarkerList(markers, selectedFriend));
|
|
|
}
|
|
|
|
|
|
- void animateCamera(UserInfo userInfo) {
|
|
|
- LocationInfo? locationInfo = userInfo.lastLocation;
|
|
|
+ void animateCameraToUser(UserInfo userInfo) {
|
|
|
+ LocationInfo? locationInfo = userInfo.lastLocation.value;
|
|
|
if (locationInfo == null ||
|
|
|
+ locationInfo.longitude == null ||
|
|
|
+ locationInfo.latitude == null ||
|
|
|
locationInfo.longitude == 0 ||
|
|
|
locationInfo.latitude == 0) {
|
|
|
return;
|
|
|
}
|
|
|
- mapController.animateCamera(CameraPosition(
|
|
|
- longitude: locationInfo.longitude,
|
|
|
- latitude: locationInfo.latitude,
|
|
|
- zoom: 18));
|
|
|
+ animateCamera(
|
|
|
+ latitude: locationInfo.latitude, longitude: locationInfo.longitude);
|
|
|
}
|
|
|
|
|
|
- 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 animateCamera({required double? latitude, required double? longitude}) {
|
|
|
+ mapController.animateCamera(
|
|
|
+ CameraPosition(longitude: longitude, latitude: latitude, zoom: 18));
|
|
|
}
|
|
|
|
|
|
void onMarkerTap(Marker marker) {
|
|
|
String id = marker.id;
|
|
|
+ if (id == Constants.mineLocationId) {
|
|
|
+ onSelectClick(mineUserInfo);
|
|
|
+ return;
|
|
|
+ }
|
|
|
UserInfo? userInfo =
|
|
|
friendsList.firstWhereOrNull((element) => element.id == id);
|
|
|
if (userInfo == null) {
|
|
|
@@ -145,5 +164,14 @@ class MainController extends BaseController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- void _updateCurrentLocation() {}
|
|
|
+ void _updateCurrentLocation() {
|
|
|
+ MapHelper.getLastLocation()?.let((it) {
|
|
|
+ animateCamera(latitude: it.latitude, longitude: it.longitude);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void onClose() {
|
|
|
+ mineLocationSubscription?.cancel();
|
|
|
+ }
|
|
|
}
|