// // 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 initialize(args: [String: Any]?, result: @escaping FlutterResult) { result(true) return } // 处理地图移动 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 zoome = cameraPosition.zoom / 10000 let span = MKCoordinateSpan(latitudeDelta: zoome, longitudeDelta: zoome) currentRegion = MKCoordinateRegion(center: center, span: span) result(nil) } // 处理地图添加Marker func handleMapAddMarker(args: [[String: Any]]?, result: @escaping FlutterResult) { guard let args = args, let markers = [ATMapMarker].fromJson(json: args) else { result(paramsDecodeError) return } // 使用字典优化查找性能 var markerDict = Dictionary(uniqueKeysWithValues: self.markers.map { ($0.id, $0) }) markerDict.merge(Dictionary(uniqueKeysWithValues: markers.map { ($0.id, $0) }), uniquingKeysWith: { _, new in new }) // 转换回数组 self.markers = Array(markerDict.values) 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 polyline = ATMapPolyline.fromJson(json: args) else { result(paramsDecodeError) return } polylines.append(polyline) result(nil) } } // Propertie Action extension MapViewModel { func toggleMarkerSelected(marker: inout ATMapMarker) { marker.isSelected = !marker.isSelected } }