// // MapViewModel.swift // Runner // // Created by Groot on 2025/5/7. // import Flutter import Foundation import MapKit import CoreLocation import SwiftUI import Combine private let coordinates: [CLLocationCoordinate2D] = [ CLLocationCoordinate2D(latitude: 39.90333, longitude: 116.39167), // 北京 CLLocationCoordinate2D(latitude: 31.23170, longitude: 121.47264), // 上海 CLLocationCoordinate2D(latitude: 22.54554, longitude: 114.05786), // 深圳 CLLocationCoordinate2D(latitude: 23.12911, longitude: 113.26437), // 广州 CLLocationCoordinate2D(latitude: 30.59276, longitude: 114.30525), // 武汉 ] class MapViewModel: NSObject, ObservableObject, MapCapability { var paramsDecodeError: FlutterError? = FlutterError(code: "InvalidArguments", message: "Invalid arguments", details: nil) var methodChannel: FlutterMethodChannel? @Published var currentRegion: MKCoordinateRegion? // 记录用户位置 @Published var userLocation: CLLocationCoordinate2D? // 地图Marker @Published var markers: [ATMapMarker] = [] // 地图Polyline @Published var polylines: [ATMapPolyline] = [] // 处理地图移动 func handleMapMoveCamera(args: [String: Any]?, result: @escaping FlutterResult) { guard let args = args, let cameraPosition = ATMapCameraPosition.fromJson(json: args) else { result(paramsDecodeError) return } let center = CLLocationCoordinate2D(latitude: cameraPosition.latitude, longitude: cameraPosition.longitude) let span = MKCoordinateSpan(latitudeDelta: cameraPosition.zoom, longitudeDelta: cameraPosition.zoom) currentRegion = MKCoordinateRegion(center: center, span: span) result(nil) } // 处理地图添加Marker func handleMapAddMarker(args: [String: Any]?, result: @escaping FlutterResult) { guard let args = args, let marker = ATMapMarker.fromJson(json: args) else { result(paramsDecodeError) return } // 检查是否已存在相同ID的标记,如果有则先移除 if let index = markers.firstIndex(where: { $0.id == marker.id }) { markers.remove(at: index) } markers.append(marker) result(nil) } // 处理地图清除Marker func handleMapClearMarkers(result: @escaping FlutterResult) { markers = [] result(nil) } // 处理地图替换所有Marker func handleMapReplaceAllMarkers(args: [String: Any]?, result: @escaping FlutterResult) { defer { result(nil) } guard let args = args, let markers = args["markers"] as? [[String: Any]] else { result(paramsDecodeError) return } let mapMarkers = markers.compactMap({ ATMapMarker.fromJson(json: $0) }) self.markers = mapMarkers } // 处理Marker点击事件 func handleMarkerTap(marker: inout ATMapMarker) { toggleMarkerSelected(marker: &marker) methodChannel?.invokeMethod(ChannelMethods.methodMarkerOnTap.rawValue, arguments: marker.toJson()) } // 处理地图添加Polyline func handleMapAddPolyline(args: [String: Any]?, result: @escaping FlutterResult) { guard let args = args, let pointsArray = args["points"] as? [[String: Any]] else { result(paramsDecodeError) return } let coordinates = pointsArray.compactMap({ CLLocationCoordinate2D.fromJson(json: $0) }) let polyline = ATMapPolyline(points: coordinates) polylines.append(polyline) result(nil) } } // Propertie Action extension MapViewModel { func toggleMarkerSelected(marker: inout ATMapMarker) { marker.isSelected = !marker.isSelected } }