Flutter二维码及条形码扫描插件combined_barcode_scanner的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter二维码及条形码扫描插件combined_barcode_scanner的使用

combined_barcode_scanner 是一个用于创建新的条形码和二维码扫描器的 Flutter 插件。它允许你将多个不同的扫描器组合成一个单一的扫描源。以下是如何使用该插件的详细说明和示例代码。

基本概念

1. 创建自定义扫描器

要实现自定义扫描器,你需要导入 combined_barcode_scanner 包,并实现 BarcodeScannerBarcodeScannerController 的子类。

2. 快速开始

在使用 combined_barcode_scanner 时,你可能会遇到一些已知的问题。例如,FastBarcodeScanner() 未找到的问题。你可以参考 GitHub 上的 Issue 获取临时解决方案。

示例用法

以下是一个完整的示例代码,展示了如何使用 combined_barcode_scanner 进行二维码和条形码扫描。

依赖项

首先,在你的 pubspec.yaml 文件中添加 combined_barcode_scanner 及其相关的依赖项:

dependencies:
  flutter:
    sdk: flutter
  combined_barcode_scanner: ^0.1.0
  combined_barcode_scanner_blue_bird: ^0.1.0
  combined_barcode_scanner_fast: ^0.1.0
  combined_barcode_scanner_honeywell: ^0.1.0
  combined_barcode_scanner_unitech: ^0.1.0
  combined_barcode_scanner_usb_keyboard: ^0.1.0
  combined_barcode_scanner_zebra: ^0.1.0

主要代码

import 'package:combined_barcode_scanner/combined_barcode_scanner.dart';
import 'package:combined_barcode_scanner_blue_bird/combined_barcode_scanner_blue_bird.dart';
import 'package:combined_barcode_scanner_fast/combined_barcode_scanner_fast.dart';
import 'package:combined_barcode_scanner_honeywell/combined_barcode_scanner_honeywell.dart';
import 'package:combined_barcode_scanner_unitech/combined_barcode_scanner_unitech.dart';
import 'package:combined_barcode_scanner_usb_keyboard/combined_barcode_scanner_usb_keyboard.dart';
import 'package:combined_barcode_scanner_zebra/combined_barcode_scanner_zebra.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late final _controller = BarcodeScannerWidgetController(_onScannerLoaded);

  bool _supportsSwitchingCamera = false;
  bool _supportsSwitchingTorch = false;
  bool _supportsZebraScan = false;
  String? _code;

  final _scanners = [
    FastBarcodeScanner(),
    HoneywellBarcodeScanner(),
    UnitechBarcodeScanner(),
    BlueBirdBarcodeScanner(),
    ZebraBarcodeScanner('my_profile'),
    UsbKeyboardScanner(),
  ];

  @override
  void initState() {
    super.initState();
    _controller.supportsSwitchingCamera
        .then((bool value) => setState(() => _supportsSwitchingCamera = value));
    _controller.supportsSwitchingTorch
        .then((bool value) => setState(() => _supportsSwitchingTorch = value));
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void _onScannerLoaded() {
    setState(() {
      _supportsZebraScan = _controller.supportsScanner<ZebraBarcodeScanner>();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          Expanded(
            child: ClipRect(
              child: BarcodeScannerWidget(
                controller: _controller,
                onScan: (code) {
                  setState(() {
                    _code = code.code;
                  });
                  print("GOT BARCODE =========== ${code.code}");
                },
                configuration: const ScannerConfiguration(
                  trimWhiteSpaces: true,
                  enableFormats: {
                    BarcodeFormat.qr,
                    BarcodeFormat.code128,
                  },
                  cameraConfiguration: CameraConfiguration(
                    frameRate: 30,
                    mode: BarcodeDetectionMode.continuous,
                    resolution: CameraResolution.medium,
                    type: CameraType.back,
                  ),
                ),
                scanners: _scanners,
              ),
            ),
          ),
          Text(
            'Code: ${_code ?? 'N/A'}',
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              if (_supportsSwitchingTorch) ...[
                MaterialButton(
                  child: Icon(
                    _controller.isTorchOn ? Icons.flash_off : Icons.flash_on,
                  ),
                  onPressed: () {
                    _controller.toggleTorch();
                    setState(() {});
                  },
                ),
              ],
              if (_supportsSwitchingCamera) ...[
                MaterialButton(
                  child: Icon(Icons.flip_camera_ios),
                  onPressed: _controller.toggleCamera,
                ),
              ],
              if (_supportsZebraScan) ...[
                Icon(Icons.barcode_reader),
              ],
            ],
          ),
        ],
      ),
    );
  }
}

代码说明

  1. 导入依赖:导入 combined_barcode_scanner 及其相关的子包。
  2. 初始化控制器:创建 BarcodeScannerWidgetController 实例,并在 initState 中初始化相机和手电筒的支持情况。
  3. 配置扫描器:在 BarcodeScannerWidget 中配置扫描器的参数,包括支持的条形码格式、相机配置等。
  4. 处理扫描结果:在 onScan 回调中处理扫描到的条形码或二维码,并更新 UI 显示。
  5. 按钮控制:根据设备支持的情况,添加切换手电筒和相机的按钮。

通过以上步骤,你可以在 Flutter 应用中集成 combined_barcode_scanner 插件,实现二维码和条形码的扫描功能。


更多关于Flutter二维码及条形码扫描插件combined_barcode_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter二维码及条形码扫描插件combined_barcode_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用combined_barcode_scanner插件进行二维码及条形码扫描的示例代码。

首先,确保你已经在pubspec.yaml文件中添加了combined_barcode_scanner依赖:

dependencies:
  flutter:
    sdk: flutter
  combined_barcode_scanner: ^x.y.z  # 请将x.y.z替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,我们编写一个示例应用,展示如何使用这个插件。

主文件 main.dart

import 'package:flutter/material.dart';
import 'package:combined_barcode_scanner/combined_barcode_scanner.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Barcode Scanner Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BarcodeScannerScreen(),
    );
  }
}

class BarcodeScannerScreen extends StatefulWidget {
  @override
  _BarcodeScannerScreenState createState() => _BarcodeScannerScreenState();
}

class _BarcodeScannerScreenState extends State<BarcodeScannerScreen> {
  String _result = '';

  Future<void> _scanBarcode() async {
    try {
      String result = await CombinedBarcodeScanner()
          .scan(
            options: ScanOptions(
              // 可以根据需要自定义扫描选项,例如:
              // beepOnScan: true,
              // android: AndroidOptions(
              //   promptMessage: "Scan a barcode",
              //   orientationLocked: false,
              //   cancelButtonText: "CANCEL",
              //   bezelColor: Colors.transparent,
              // ),
              // ios: IOSOptions(
              //   rectOfInterest: Rect.fromLTWH(200, 200, 400, 400),
              // ),
            ),
          )
          .first;
      setState(() {
        _result = result;
      });
    } catch (e) {
      print("Error scanning barcode: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Barcode Scanner Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Scan Result:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            Text(
              _result,
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 40),
            ElevatedButton(
              onPressed: _scanBarcode,
              child: Text('Scan Barcode'),
            ),
          ],
        ),
      ),
    );
  }
}

说明

  1. 依赖添加:在pubspec.yaml中添加combined_barcode_scanner依赖。
  2. 扫描功能:在_scanBarcode函数中,我们使用CombinedBarcodeScanner().scan()方法来启动扫描器。这个方法是异步的,返回扫描结果。
  3. UI展示:在UI中,我们有一个Text控件显示扫描结果,以及一个ElevatedButton控件触发扫描操作。
  4. 扫描选项ScanOptions允许你自定义扫描行为,例如是否发出蜂鸣声、Android和iOS的特定选项等。在示例代码中,这些选项被注释掉了,但你可以根据需要启用它们。

运行这个应用,点击“Scan Barcode”按钮,将会启动设备上的摄像头进行二维码或条形码的扫描,并将结果显示在屏幕上。

回到顶部