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
相关产品推荐
相关产品推荐

