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

Flutter应用被杀重启后Method Channel未创建,无法调用Native代码求助

解决Flutter应用被杀重启后Method Channel无法调用Native的问题

应用被杀重启后出现Tried to send a platform message to Flutter, but FlutterJNI was detached from native C++. Could not send. Channel: com.example.inyourskin. Response ID:报错,本质是应用重启后Native端的FlutterJNI实例失效,原Method Channel绑定关系丢失,导致无法通信。以下是分平台的修复方案:

Android端修复

  • 在configureFlutterEngine中初始化Method Channel
    应用重启时Flutter引擎会重新初始化,configureFlutterEngine会被触发,这是绑定Channel的正确时机,不要在onCreate等早期生命周期方法中创建:
    class MainActivity : FlutterActivity() {
      override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
          super.configureFlutterEngine(flutterEngine)
          // 初始化Method Channel并设置回调
          MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example.inyourskin")
              .setMethodCallHandler { call, result ->
                  when (call.method) {
                      "yourTargetMethod" -> {
                          // 执行Native逻辑并返回结果
                          result.success("处理完成")
                      }
                      else -> result.notImplemented()
                  }
              }
      }
    }
    
  • 别用静态引用存FlutterEngine/Channel
    静态变量会持有旧的失效实例,重启后无法绑定新引擎,必须避免。

iOS端修复

  • 在didFinishLaunchingWithOptions中重新绑定Channel
    应用被杀重启时didFinishLaunchingWithOptions会重新执行,在这里确保Channel和新的FlutterViewController绑定:
    @UIApplicationMain
    @objc class AppDelegate: FlutterAppDelegate {
      override func application(
          _ application: UIApplication,
          didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
      ) -> Bool {
          guard let controller = window?.rootViewController as? FlutterViewController else {
              return super.application(application, didFinishLaunchingWithOptions: launchOptions)
          }
          let channel = FlutterMethodChannel(name: "com.example.inyourskin", binaryMessenger: controller.binaryMessenger)
          channel.setMethodCallHandler { [weak self] call, result in
              guard let self = self else { return }
              switch call.method {
              case "yourTargetMethod":
                  // 处理Native逻辑
                  result("处理完成")
              default:
                  result(FlutterMethodNotImplemented)
              }
          }
          GeneratedPluginRegistrant.register(with: self)
          return super.application(application, didFinishLaunchingWithOptions: launchOptions)
      }
    }
    
  • 用弱引用避免循环引用
    设置回调时使用[weak self],防止旧实例无法释放,影响新实例创建。

通用注意事项

  • Flutter端延迟调用Native方法
    不要在main函数里过早调用Native方法,确保引擎和Channel初始化完成后再执行,比如在initState中借助addPostFrameCallback延迟:
    final _channel = MethodChannel('com.example.inyourskin');
    
    @override
    void initState() {
      super.initState();
      WidgetsBinding.instance.addPostFrameCallback((_) {
        // 这里调用Native方法更安全
        _channel.invokeMethod('yourTargetMethod');
      });
    }
    
  • Native后台任务先检查绑定状态
    如果后台有任务需要调用Flutter,Android端先判断flutterEngine.dartExecutor.isAttached,iOS端确认binaryMessenger有效,避免在未绑定状态下发消息。

内容的提问来源于stack exchange,提问作者Jalpa Panchal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:37:23