Flutter iOS原生代码中FlutterResult无法触发问题求助
问题原因及解决办法
核心问题
你直接替换了window.rootViewController,原来的FlutterViewController被移除出视图层级,导致绑定它的FlutterMethodChannel通信链路断开,后续调用result时无法将消息传递回Flutter端。
解决步骤
1. 保留原通信通道
不要替换根控制器,改用模态弹出原生页面的方式,这样能维持原FlutterViewController与MethodChannel的绑定关系。
修改后的代码示例
@UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let controller : FlutterViewController = window?.rootViewController as! FlutterViewController let testChannel = FlutterMethodChannel(name: "test", binaryMessenger: controller.binaryMessenger) testChannel.setMethodCallHandler({ [weak self, weak controller] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in guard call.method == "startProcess" else { result(FlutterMethodNotImplemented) return } let args = call.arguments as! Dictionary<String, Any> let mainVC = ViewController() mainVC.callBack = { (resultValue: String) in print("Callback called:") print(resultValue) // 现在可正常触发回调 result(resultValue) }; mainVC.caseId = args["caseId"] as! String let navigationController = UINavigationController(rootViewController: mainVC) // 以模态方式弹出原生页面,而非替换根控制器 controller?.present(navigationController, animated: true) }) GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
2. 额外注意事项
- 给
controller添加weak引用,避免循环引用导致内存泄漏 FlutterResult只能调用一次,多次调用会触发框架异常,需删除冗余的result("test")调用- 若业务必须替换根控制器,需确保原
FlutterViewController不被释放,或重新创建MethodChannel绑定新上下文,但这种方案复杂度更高,不推荐优先使用
内容的提问来源于stack exchange,提问作者F0rce
相关产品推荐
相关产品推荐

