MapViewModel.swift 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. //
  2. // MapViewModel.swift
  3. // Runner
  4. //
  5. // Created by Groot on 2025/5/7.
  6. //
  7. import Flutter
  8. import Foundation
  9. import MapKit
  10. import CoreLocation
  11. import SwiftUI
  12. import Combine
  13. class MapViewModel: NSObject, ObservableObject, MapCapability {
  14. var paramsDecodeError: FlutterError? = FlutterError(code: "InvalidArguments", message: "Invalid arguments", details: nil)
  15. var methodChannel: FlutterMethodChannel?
  16. @Published var currentRegion: MKCoordinateRegion?
  17. // 地图Marker
  18. @Published var markers: [ATMapMarker] = []
  19. // 地图Polyline
  20. @Published var polylines: [ATMapPolyline] = []
  21. func initialize(args: [String: Any]?, result: @escaping FlutterResult) {
  22. result(true)
  23. return
  24. }
  25. // 处理地图移动
  26. func handleMapMoveCamera(args: [String: Any]?, result: @escaping FlutterResult) {
  27. guard let args = args, let cameraPosition = ATMapCameraPosition.fromJson(json: args) else {
  28. result(paramsDecodeError)
  29. return
  30. }
  31. let center = CLLocationCoordinate2D(latitude: cameraPosition.latitude, longitude: cameraPosition.longitude)
  32. let zoome = cameraPosition.zoom / 10000
  33. let span = MKCoordinateSpan(latitudeDelta: zoome, longitudeDelta: zoome)
  34. currentRegion = MKCoordinateRegion(center: center, span: span)
  35. result(nil)
  36. }
  37. // 处理地图添加Marker
  38. func handleMapAddMarker(args: [[String: Any]]?, result: @escaping FlutterResult) {
  39. guard let args = args, let markers = [ATMapMarker].fromJson(json: args) else {
  40. result(paramsDecodeError)
  41. return
  42. }
  43. // 使用字典优化查找性能
  44. var markerDict = Dictionary(uniqueKeysWithValues: self.markers.map { ($0.id, $0) })
  45. markerDict.merge(Dictionary(uniqueKeysWithValues: markers.map { ($0.id, $0) }), uniquingKeysWith: { _, new in new })
  46. // 转换回数组
  47. self.markers = Array(markerDict.values)
  48. result(nil)
  49. }
  50. // 处理地图清除Marker
  51. func handleMapClearMarkers(result: @escaping FlutterResult) {
  52. markers = []
  53. result(nil)
  54. }
  55. // 处理地图替换所有Marker
  56. func handleMapReplaceAllMarkers(args: [[String: Any]]?, result: @escaping FlutterResult) {
  57. defer {
  58. result(nil)
  59. }
  60. guard let args = args, let markers = [ATMapMarker].fromJson(json: args) else {
  61. result(paramsDecodeError)
  62. return
  63. }
  64. self.markers = markers
  65. }
  66. // 处理Marker点击事件
  67. func handleMarkerTap(marker: inout ATMapMarker) {
  68. toggleMarkerSelected(marker: &marker)
  69. methodChannel?.invokeMethod(ChannelMethods.methodMarkerOnTap.rawValue, arguments: marker.toJson())
  70. }
  71. // 处理地图添加Polyline
  72. func handleMapAddPolyline(args: [String: Any]?, result: @escaping FlutterResult) {
  73. guard let args = args, let polyline = ATMapPolyline.fromJson(json: args) else {
  74. result(paramsDecodeError)
  75. return
  76. }
  77. polylines.append(polyline)
  78. result(nil)
  79. }
  80. }
  81. // Propertie Action
  82. extension MapViewModel {
  83. func toggleMarkerSelected(marker: inout ATMapMarker) {
  84. marker.isSelected = !marker.isSelected
  85. }
  86. }