Flutter 开发中遇到 Swift 闭包回调报错:C function pointer cannot be formed from a closure that captures context
最近在写 flutter 跟 ios swift 原生通信的 demo,遇到一个问题,报这个错:
C function pointer cannot be formed from a closure that captures context
代码如下:
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
let controller: FlutterViewController = window?.rootViewController as! FlutterViewController
CFNotificationCenterAddObserver(center, Unmanaged.passUnretained(self).toOpaque(), { (center, observer, name, object, userInfo) in
NSLog("Notify received")
CustomChannel.sendMessageToFlutter(controller: controller)
public struct CustomChannel {
static func sendMessageToFlutter(controller: FlutterViewController){
let channel = FlutterMethodChannel(
name: "paymentview",
binaryMessenger: controller.binaryMessenger
)
DispatchQueue.main.async {
channel.invokeMethod("authorized", arguments: nil)
}
}
}
swift 现在是边学边写,这个闭包看起来有点看不懂。
Flutter 开发中遇到 Swift 闭包回调报错:C function pointer cannot be formed from a closure that captures context
更多关于Flutter 开发中遇到 Swift 闭包回调报错:C function pointer cannot be formed from a closure that captures context的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter 开发中遇到 Swift 闭包回调报错:C function pointer cannot be formed from a closure that captures context的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter开发中,当使用Swift进行iOS平台原生模块开发时,遇到“C function pointer cannot be formed from a closure that captures context”这个错误,通常意味着你尝试将一个捕获了上下文的闭包(closure)用作C语言风格的函数指针。
在Swift中,闭包默认会捕获其所在作用域中的变量,而C语言风格的函数指针则要求函数是“纯”的,即不依赖于外部状态。当闭包捕获了上下文(如self或外部变量),它就不再是一个简单的函数指针,因此无法直接转换为C语言中的函数指针。
解决这个问题的方法通常有以下几种:
-
使用全局函数或静态方法:确保函数不捕获任何上下文。这可以通过将函数定义为全局函数或类的静态方法来实现。
-
使用
@escaping
闭包和桥接:如果你的设计确实需要闭包,考虑使用@escaping
闭包,并通过某种机制(如Objective-C的block或自定义桥接层)来传递这个闭包。这通常涉及到更复杂的架构设计,可能包括将闭包封装在Objective-C block中,然后传递给C/C++层。 -
重新设计接口:如果可能,重新设计你的接口,避免将Swift闭包直接传递给C/C++代码。考虑使用更简单的数据传递机制,如回调ID或消息传递系统。
总之,解决这类问题通常需要对Swift和C/C++之间的交互有深入的理解,并可能需要调整你的设计策略。