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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:18:04