Flutter Camera:按Home键将App退至后台持续抛出异常
解决Flutter Camera插件后台抛出Handler死线程异常问题
问题分析
你遇到的是camera: ^0.9.2+2版本的已知bug:应用退到后台后,相机资源未被正确释放,相机回调仍尝试向已销毁的线程发送消息,导致持续抛出Handler sending message to a dead thread异常;返回前台后预览冻结,常规的pausePreview()/resumePreview()无法解决核心问题。
解决方案
1. 优先升级Camera插件版本
旧版本camera插件存在后台资源泄漏问题,后续稳定版本已修复该bug。直接升级到最新稳定版(例如camera: ^0.10.0+1及以上)即可解决大部分此类问题。
修改pubspec.yaml中的依赖:
dependencies: camera: ^0.10.0+1 # 替换为最新稳定版
执行flutter pub get更新依赖后重新运行项目。
2. 手动管理相机生命周期(适用于无法升级插件的场景)
通过监听应用生命周期,在后台时彻底释放相机资源,前台恢复时重新初始化相机:
在页面的State类中混入WidgetsBindingObserver,实现状态监听逻辑:
class CameraPageState extends State<CameraPage> with WidgetsBindingObserver { CameraController? _controller; List<CameraDescription>? _cameras; @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); _initCamera(); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); _controller?.dispose(); super.dispose(); } // 监听应用生命周期变化 @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); if (_controller == null || !_controller!.value.isInitialized) { return; } switch (state) { case AppLifecycleState.paused: // 退到后台时彻底释放相机资源 _controller?.dispose(); _controller = null; break; case AppLifecycleState.resumed: // 返回前台时重新初始化相机 if (_controller == null) { _initCamera(); } break; default: break; } } // 相机初始化方法 Future<void> _initCamera() async { _cameras = await availableCameras(); if (_cameras != null && _cameras!.isNotEmpty) { _controller = CameraController( _cameras![0], ResolutionPreset.medium, ); await _controller!.initialize(); if (mounted) { setState(() {}); } } } @override Widget build(BuildContext context) { if (_controller == null || !_controller!.value.isInitialized) { return const Center(child: Text('相机初始化中...')); } return CameraPreview(_controller!); } }
3. 额外注意事项
- 升级插件后若仍有异常,检查相机权限是否在前台恢复时重新获取(部分Android机型会在后台回收硬件权限)。
- 避免在后台保留相机资源,Android系统对后台应用的硬件访问有严格限制,强行保留会触发系统回收,引发异常。
内容的提问来源于stack exchange,提问作者Gilded Json
相关产品推荐
相关产品推荐

