MapFlutterView.swift 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //
  2. // MapFlutterView.swift
  3. // Runner
  4. //
  5. // Created by Groot on 2025/5/7.
  6. //
  7. import Flutter
  8. import UIKit
  9. import SwiftUI
  10. class MapFlutterViewFactory: NSObject, FlutterPlatformViewFactory {
  11. private var messenger: FlutterBinaryMessenger
  12. init(messenger: FlutterBinaryMessenger) {
  13. self.messenger = messenger
  14. }
  15. func create(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?) -> FlutterPlatformView {
  16. return MapFlutterView(withFrame: frame, viewIdentifier: viewId, arguments: args, binaryMessenger: messenger)
  17. }
  18. func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
  19. return FlutterStandardMessageCodec.sharedInstance()
  20. }
  21. }
  22. class MapFlutterView: NSObject, FlutterPlatformView {
  23. var contentView: UIView
  24. var methodChannel: FlutterMethodChannel
  25. var viewModel: MapViewModel = .init()
  26. init(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?, binaryMessenger messenger: FlutterBinaryMessenger) {
  27. contentView = UIView()
  28. methodChannel = FlutterMethodChannel(name: MapKitConstans.methodChannelName, binaryMessenger: messenger)
  29. super.init()
  30. createMapView()
  31. setupMethodChannel()
  32. }
  33. func view() -> UIView {
  34. return contentView
  35. }
  36. func createMapView() {
  37. let keyWindows = (UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first(where: { $0.isKeyWindow })
  38. let topController = keyWindows?.rootViewController
  39. viewModel.methodChannel = methodChannel
  40. let vc = MapViewController(viewModel: viewModel)
  41. let mapView = vc.view!
  42. mapView.translatesAutoresizingMaskIntoConstraints = false
  43. topController?.addChild(vc)
  44. contentView.addSubview(mapView)
  45. NSLayoutConstraint.activate(
  46. [
  47. mapView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
  48. mapView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
  49. mapView.topAnchor.constraint(equalTo: contentView.topAnchor),
  50. mapView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
  51. ]
  52. )
  53. vc.didMove(toParent: topController)
  54. }
  55. func setupMethodChannel() {
  56. methodChannel.setMethodCallHandler({ [weak self] (call, result) in
  57. self?.viewModel.handleMethodCall(call, result: result)
  58. })
  59. }
  60. }