You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.0 KiB

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))
}
}
}