Flutter切换相机拍照页后QR扫码功能失效报错如何解决?
问题原因
该错误是典型的相机硬件资源冲突导致:
- Android系统底层限制同一时间只能有一个实例占用相机硬件
- 你使用的
camera和scan两个插件分别独立持有相机实例 - 默认底部标签页切换时会保活页面,不会触发页面销毁逻辑,退出标签页时相机资源没有被正确释放,新打开的标签页申请相机资源时被占用就会抛出该错误
- 现有代码中扫码页的
ScanController完全没有做资源释放处理,拍照页的相机控制器释放逻辑也存在时序问题
修复方案
1. 补全两个页面的资源释放逻辑
拍照页CaptureTab的dispose方法修改
调整释放时序,先停止图像流再释放控制器:
@override void dispose() { _controller.stopImageStream().then((_) { _controller.dispose(); }); super.dispose(); }
扫码页ResourceTab的dispose方法修改
新增扫码控制器的释放逻辑:
@override void dispose() { controller.pause(); controller.dispose(); super.dispose(); }
2. 禁用标签页保活机制
如果你的底部导航使用了IndexedStack或者TabBarView默认保活,需要修改实现让切换标签时旧页面销毁:
- 替换
IndexedStack为按需加载的动态Widget切换逻辑 - 移除标签页State中
AutomaticKeepAliveClientMixin的保活配置,确保切换时触发dispose方法
3. 优化标签切换时序(可选)
如果仍然偶现冲突,可以在底部导航的切换回调中,先完成前一个页面的相机资源释放,再加载新的标签页内容,避免两个插件同时申请相机资源。
4. 长期优化方案
避免使用两个独立的相机插件,统一用camera插件实现底层相机能力,二维码识别可在相机的图像流中通过纯Dart识别库实现,从根源避免多实例资源冲突。
内容的提问来源于stack exchange,提问作者Atiq Ur Rehman
相关产品推荐
相关产品推荐

