import Flutter import UIKit @objc(FLNativeViewFactory) public class FLNativeViewFactory: NSObject, FlutterPlatformViewFactory { private let messenger: FlutterBinaryMessenger public init(messenger: FlutterBinaryMessenger) { self.messenger = messenger super.init() } public func create( withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any? ) -> FlutterPlatformView { return FLNativeView(frame: frame, viewIdentifier: viewId, arguments: args, binaryMessenger: messenger) } public func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol { return FlutterStandardMessageCodec.sharedInstance() } } public class FLNativeView: NSObject, FlutterPlatformView { private let viewInstance: PlayerView private let methodChannel: FlutterMethodChannel public init( frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?, binaryMessenger messenger: FlutterBinaryMessenger ) { viewInstance = PlayerView() methodChannel = FlutterMethodChannel(name: "native_plugin/native_view_\(viewId)", binaryMessenger: messenger) super.init() methodChannel.setMethodCallHandler { [weak self] call, result in self?.onMethodCall(call, result: result) } } public func view() -> UIView { return viewInstance } private func onMethodCall(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "getInternalView": let ptr = Unmanaged.passUnretained(viewInstance).toOpaque() let viewId = UInt64(UInt(bitPattern: ptr)) result(NSNumber(value: viewId)) case "updateContent": let data = call.arguments as? [String: Any] let lang = data?["lang"] as? String let cn = data?["cn"] as? String let en = data?["en"] as? String DispatchQueue.main.async { [weak self] in self?.viewInstance.update(withLang: lang, cn: cn, en: en) } result(nil) default: result(NSNumber(value: 0)) } } }