Flutter 开发中遇到 Swift 闭包回调报错:C function pointer cannot be formed from a closure that captures context

发布于 1周前 作者 yibo5220 来自 Flutter

最近在写 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

1 回复

更多关于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语言中的函数指针。

解决这个问题的方法通常有以下几种:

  1. 使用全局函数或静态方法:确保函数不捕获任何上下文。这可以通过将函数定义为全局函数或类的静态方法来实现。

  2. 使用@escaping闭包和桥接:如果你的设计确实需要闭包,考虑使用@escaping闭包,并通过某种机制(如Objective-C的block或自定义桥接层)来传递这个闭包。这通常涉及到更复杂的架构设计,可能包括将闭包封装在Objective-C block中,然后传递给C/C++层。

  3. 重新设计接口:如果可能,重新设计你的接口,避免将Swift闭包直接传递给C/C++代码。考虑使用更简单的数据传递机制,如回调ID或消息传递系统。

总之,解决这类问题通常需要对Swift和C/C++之间的交互有深入的理解,并可能需要调整你的设计策略。

回到顶部