Flutter使用flutter_background_service时应用恢复出现无限报错
问题产生原因
这个报错的核心触发逻辑是FlutterJNI和原生C++层解绑后,仍然有原生侧的传感器事件持续向失效的消息通道发数据,结合你用flutter_background_service的场景,具体诱因有三个:
flutter_background_service启动后台服务时会创建独立于前台UI的FlutterEngine实例,两个Engine的消息通道完全隔离,若插件注册、监听逻辑没有做隔离,很容易出现通道引用错乱。- 加速度计传感器的事件订阅没有在应用退后台、Engine解绑时被正确取消,原生传感器服务还在持有旧的通道引用,应用切回前台时就会持续向已经失效的FlutterJNI发送数据,触发无限报错。
- 你当前使用的Flutter 2.10.2版本对多Engine场景的消息路由处理存在已知bug,同时低版本的sensors插件也不会在Engine detach时自动注销传感器监听,会放大这个问题。
可落地解决方案
按优先级依次尝试以下操作:
- 严格管理传感器订阅的生命周期
不要全局持有加速度计的StreamSubscription,绑定应用生命周期回调,在应用退到后台、处于inactive/detached状态时立刻取消订阅,回到前台后再重新注册监听,参考实现:import 'package:sensors/sensors.dart'; import 'package:flutter/widgets.dart'; StreamSubscription<AccelerometerEvent>? _accelSub; @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); switch (state) { case AppLifecycleState.resumed: // 回到前台再注册监听 _accelSub = accelerometerEvents.listen((event) { // 处理加速度业务逻辑 }); break; case AppLifecycleState.inactive: case AppLifecycleState.paused: case AppLifecycleState.detached: // 离开前台立刻取消订阅 _accelSub?.cancel(); _accelSub = null; break; } } - 隔离前后台Engine的插件逻辑
不要在flutter_background_service的后台服务入口函数中初始化sensors插件、注册加速度计相关监听,所有和传感器相关的逻辑全部放到前台UI的Isolate中执行,避免后台独立Engine持有传感器通道的无效引用。使用0.3.5及以上版本的flutter_background_service时,不要手动在后台服务代码中重复注册sensors插件。 - 升级依赖版本
将pubspec.yaml中的sensors/sensors_plus、flutter_background_service升级到当前适配你Flutter版本的稳定版,升级后执行flutter clean清除构建缓存,完全卸载旧应用后重新冷构建安装,不要用热重载/热重启测试该场景。 - 原生侧兜底处理
如果以上操作后问题仍然存在,可以在Android主Activity中添加解绑回调,手动清空失效的传感器通道handler,参考Kotlin实现:import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.EventChannel class MainActivity: FlutterActivity() { private val ACCEL_CHANNEL_NAME = "plugins.flutter.io/sensors/accelerometer" override fun onFlutterEngineDetachedFromNative(flutterEngine: FlutterEngine) { EventChannel(flutterEngine.dartExecutor.binaryMessenger, ACCEL_CHANNEL_NAME).setStreamHandler(null) super.onFlutterEngineDetachedFromNative(flutterEngine) } } - 升级Flutter SDK
Flutter 2.10.2版本对多Engine场景的支持存在已知缺陷,若条件允许建议升级到Flutter 3.x系列稳定版,从SDK层面修复多Engine下的消息路由错误。
测试注意:不要用debug模式的热重载/热重启验证该问题,debug模式下会残留大量未释放的通道句柄,容易出现假阳性报错,必须用release包安装到真机,冷启动后测试前后台切换场景。
内容的提问来源于stack exchange,提问作者obidano
相关产品推荐
相关产品推荐

