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

Flutter中qr_code_scanner启动黑屏,切后台返回后恢复

问题分析与修复方案

核心问题

启动时摄像头未正常初始化:initState中调用controller?.resumeCamera()时,controller还未被赋值(_onQRViewCreated回调晚于initState执行),这行代码完全无效;而切换后台再返回时,reassemble方法触发了摄像头恢复逻辑,所以能正常工作。

修复步骤

1. 确认摄像头权限配置

  • Android:在android/app/src/main/AndroidManifest.xml中添加权限声明
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
  • iOS:在ios/Runner/Info.plist中添加权限描述
<key>NSCameraUsageDescription</key>
<string>需要摄像头权限来扫描二维码</string>

2. 修正摄像头初始化逻辑

移除initState中无效的resumeCamera调用,改为在_onQRViewCreated回调中主动触发摄像头启动,适配Android平台特性:

void _onQRViewCreated(QRViewController controller) {
  this.controller = controller;
  // Android平台需主动恢复摄像头
  if (Platform.isAndroid) {
    controller.resumeCamera();
  }
  controller.scannedDataStream.listen((scanData) {
    setState(() {
      result = scanData;
    });
  });
}

3. 优化生命周期管理(可选)

添加应用生命周期监听,确保摄像头在前台时持续运行,后台时暂停:

class _QrScanState extends State<QrScan> with WidgetsBindingObserver {
  final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
  Barcode? result;
  QRViewController? controller;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (controller == null) return;
    switch (state) {
      case AppLifecycleState.resumed:
        controller!.resumeCamera();
        break;
      case AppLifecycleState.paused:
        controller!.pauseCamera();
        break;
      default:
        break;
    }
  }

  // 保留原有其他方法...

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    controller?.dispose();
    super.dispose();
  }
}

验证效果

完成修改后重新运行应用,启动时摄像头应直接初始化并显示画面,无需切换后台即可正常扫码。

内容的提问来源于stack exchange,提问作者Sovit Nayak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:06:30