You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:15:40