| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- //
- // MapFlutterView.swift
- // Runner
- //
- // Created by Groot on 2025/5/7.
- //
- import Flutter
- import UIKit
- import SwiftUI
- class MapFlutterViewFactory: NSObject, FlutterPlatformViewFactory {
- private var messenger: FlutterBinaryMessenger
- init(messenger: FlutterBinaryMessenger) {
- self.messenger = messenger
- }
- func create(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?) -> FlutterPlatformView {
- return MapFlutterView(withFrame: frame, viewIdentifier: viewId, arguments: args, binaryMessenger: messenger)
- }
- func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
- return FlutterStandardMessageCodec.sharedInstance()
- }
- }
- class MapFlutterView: NSObject, FlutterPlatformView {
- var contentView: UIView
- var methodChannel: FlutterMethodChannel
-
- var viewModel: MapViewModel = .init()
- init(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?, binaryMessenger messenger: FlutterBinaryMessenger) {
- contentView = UIView()
- methodChannel = FlutterMethodChannel(name: MapKitConstans.methodChannelName, binaryMessenger: messenger)
- super.init()
- createMapView()
- setupMethodChannel()
- }
- func view() -> UIView {
- return contentView
- }
- func createMapView() {
- let keyWindows = (UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first(where: { $0.isKeyWindow })
- let topController = keyWindows?.rootViewController
-
- viewModel.methodChannel = methodChannel
- let vc = MapViewController(viewModel: viewModel)
- let mapView = vc.view!
- mapView.translatesAutoresizingMaskIntoConstraints = false
-
- topController?.addChild(vc)
- contentView.addSubview(mapView)
-
- NSLayoutConstraint.activate(
- [
- mapView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
- mapView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
- mapView.topAnchor.constraint(equalTo: contentView.topAnchor),
- mapView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
- ]
- )
-
- vc.didMove(toParent: topController)
- }
- func setupMethodChannel() {
- methodChannel.setMethodCallHandler({ [weak self] (call, result) in
- self?.viewModel.handleMethodCall(call, result: result)
- })
- }
- }
|