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
相关产品推荐
相关产品推荐

