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

Flutter中有无不与image_picker冲突的二维码/条码扫描插件?

解决Flutter二维码/条码扫描插件与image_picker冲突的方案

我之前开发类似「扫码连服务器+商品条码扫描+图片上传」的应用时,也踩过barcode_scan这类插件和image_picker冲突的坑,给你推荐几个亲测兼容的替代方案,附上手要点:

推荐插件1:qr_code_scanner

这个插件基于Android的Camera2 API和iOS的AVFoundation实现,和image_picker的依赖链完全不重叠,不会出现资源抢占的冲突问题。

  • 添加依赖:在pubspec.yaml里加入:
    qr_code_scanner: ^1.0.1
    
  • 基础用法示例:
    import 'package:qr_code_scanner/qr_code_scanner.dart';
    
    class ScanScreen extends StatefulWidget {
      @override
      _ScanScreenState createState() => _ScanScreenState();
    }
    
    class _ScanScreenState extends State<ScanScreen> {
      final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
      QRViewController? controller;
    
      @override
      void dispose() {
        controller?.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: QRView(
            key: qrKey,
            onQRViewCreated: _onQRViewCreated,
          ),
        );
      }
    
      void _onQRViewCreated(QRViewController controller) {
        this.controller = controller;
        controller.scannedDataStream.listen((scanData) {
          // 处理扫描到的二维码/条码数据
          print(scanData.code);
          controller.stopCamera();
          Navigator.pop(context, scanData.code);
        });
      }
    }
    
  • 权限配置:
    • Android:在AndroidManifest.xml中添加相机权限:
      <uses-permission android:name="android.permission.CAMERA" />
      
    • iOS:在Info.plist中添加相机权限描述:
      <key>NSCameraUsageDescription</key>
      <string>需要相机权限进行扫码</string>
      

推荐插件2:flutter_barcode_scanner

这个插件采用原生平台的独立扫码实现,和image_picker的资源调用逻辑完全分离,稳定性不错,支持二维码和多种条码格式。

  • 添加依赖:
    flutter_barcode_scanner: ^2.0.0
    
  • 基础用法示例:
    import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
    
    Future<void> scanBarcode() async {
      String barcodeScanRes;
      try {
        barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
            '#ff6666', '取消', true, ScanMode.BARCODE);
      } catch (e) {
        barcodeScanRes = '扫描失败:$e';
      }
      // 处理扫描结果
      print(barcodeScanRes);
    }
    
  • 权限配置和上面一致,确保平台权限都已正确声明。

额外冲突排查建议

如果后续还是遇到依赖冲突,可以试试这些操作:

  • 执行flutter pub cache clean清理缓存后,再重新拉取依赖
  • 确保image_picker和扫描插件都使用最新稳定版本,执行flutter pub upgrade更新所有依赖
  • 检查Android项目的build.gradle中,compileSdkVersion和targetSdkVersion是否统一(建议使用33及以上)

内容的提问来源于stack exchange,提问作者Nato Boram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:32:23