Flutter条码扫描插件flutter_bar_scanner_alternative的使用

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

Flutter条码扫描插件flutter_bar_scanner_alternative的使用

一个为Flutter应用添加条码扫描支持的插件,适用于Android和iOS。

演示GIF

尝试示例

只需克隆或下载存储库,打开项目(在Android Studio/VS Code中),打开pubspec.yaml文件并点击Packages get。 连接设备并点击运行。 要在iPhone上运行,你需要先从Xcode运行,然后在example/ios目录下执行pod install,最后再从Xcode运行。

入门指南

请遵循以下步骤进行Android和iOS设置:

Android

无需做任何操作。

iOS - 需要Swift支持

部署目标版本:12

1. 新建项目

  1. 创建一个新的Flutter项目。请确保勾选“包含Swift支持以支持iOS代码”。
  2. 创建完成后,在Xcode中打开/ios项目,并将最小部署目标设置为12,将Swift版本设置为5。
  3. 设置好部署目标和Swift版本后,关闭Xcode,然后在Flutter项目的/ios目录下运行pod install

你已经完成了基本配置,现在可以进入下一节“如何使用”。

2. 添加到现有Flutter项目

如果你的现有iOS代码是Swift
  1. 将最小部署目标设置为12,并将Swift版本设置为5。
  2. 关闭Xcode,然后在Flutter项目的/ios目录下运行pod install
  3. 现在可以进入下一节“如何使用”。
如果你的现有iOS代码是Objective-C
  1. 在不同的位置创建一个新的同名Flutter项目(创建时别忘了勾选“包含Swift支持以支持iOS代码”)。
  2. 复制新创建的/ios文件夹,并替换现有项目的/ios文件夹。
  3. 打开iOS项目在Xcode中,将最小部署目标设置为12,并将Swift版本设置为5。
  4. 运行pod install

注意: 如果你在iOS部分进行了任何更改,可能需要重新进行这些配置。

如何使用?

iOS

为了在iOS上使用,你需要添加相机使用描述。打开Xcode并在Info.plist文件中添加以下内容:

<key>NSCameraUsageDescription</key>
<string>Camera permission is required for barcode scanning.</string>

Android 和 iOS

在Android和iOS上完成上述更改后,将flutter_barcode_scanner添加到pubspec.yaml文件中:

dependencies:
  ...
  flutter_barcode_scanner: ^1.0.4

一次性扫描

  1. 首先导入包:
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
  1. 使用scanBarcode方法访问条码扫描功能:
String barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
    COLOR_CODE, 
    CANCEL_BUTTON_TEXT, 
    isShowFlashIcon, 
    scanMode);

在这里,

  • COLOR_CODE 是十六进制颜色代码,用于设置条码覆盖线的颜色。
  • CANCEL_BUTTON_TEXT 是取消按钮上的文本,你可以自定义。
  • isShowFlashIcon 是布尔值,用于控制是否显示闪光灯图标。
  • scanMode 是枚举类型,用户可以选择QR, BARCODE, 或 DEFAULT。默认情况下是QR

持续扫描

如果你需要持续扫描条码而不关闭摄像头,可以使用getBarcodeStreamReceiver方法:

FlutterBarcodeScanner.getBarcodeStreamReceiver(
    "#ff6666", "Cancel", false, ScanMode.DEFAULT)
.listen((barcode) { 
    // 处理扫描结果
});

完整示例代码

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _scanBarcode = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  Future<void> startBarcodeScanStream() async {
    FlutterBarcodeScanner.getBarcodeStreamReceiver(
            '#ff6666', 'Cancel', true, ScanMode.BARCODE)!
        .listen((barcode) => print(barcode));
  }

  Future<void> scanQR() async {
    String barcodeScanRes;
    // 平台消息可能会失败,所以我们使用PlatformException来捕获异常。
    try {
      barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
          '#ff6666', 'Cancel', true, ScanMode.QR);
      print(barcodeScanRes);
    } on PlatformException {
      barcodeScanRes = 'Failed to get platform version.';
    }

    // 如果小部件在异步平台消息处理过程中被从树中移除,我们希望丢弃回复而不是调用setState来更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _scanBarcode = barcodeScanRes;
    });
  }

  // 平台消息是异步的,因此我们需要在一个异步方法中初始化。
  Future<void> scanBarcodeNormal() async {
    String barcodeScanRes;
    // 平台消息可能会失败,所以我们使用PlatformException来捕获异常。
    try {
      barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
          '#ff6666', 'Cancel', true, ScanMode.BARCODE);
      print(barcodeScanRes);
    } on PlatformException {
      barcodeScanRes = 'Failed to get platform version.';
    }

    // 如果小部件在异步平台消息处理过程中被从树中移除,我们希望丢弃回复而不是调用setState来更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _scanBarcode = barcodeScanRes;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(title: const Text('条码扫描')),
            body: Builder(builder: (BuildContext context) {
              return Container(
                  alignment: Alignment.center,
                  child: Flex(
                      direction: Axis.vertical,
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        ElevatedButton(
                            onPressed: () => scanBarcodeNormal(),
                            child: Text('开始条码扫描')),
                        ElevatedButton(
                            onPressed: () => scanQR(),
                            child: Text('开始QR码扫描')),
                        ElevatedButton(
                            onPressed: () => startBarcodeScanStream(),
                            child: Text('开始条码流扫描')),
                        Text('扫描结果: $_scanBarcode\n',
                            style: TextStyle(fontSize: 20))
                      ]));
            })));
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_bar_scanner_alternative插件进行条码扫描的示例代码。这个插件提供了一个简单的方法来集成条码扫描功能到你的Flutter应用中。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加flutter_bar_scanner_alternative依赖:

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

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

2. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter_bar_scanner_alternative/flutter_bar_scanner_alternative.dart';

3. 请求权限(如果需要)

在某些平台上,你可能需要请求相机权限。你可以在AndroidManifest.xmlInfo.plist中声明权限,并在运行时请求权限(如果需要)。以下是一个简单的权限请求示例(使用permission_handler插件):

import 'package:permission_handler/permission_handler.dart';

Future<void> requestCameraPermission() async {
  var status = await Permission.camera.status;
  if (!status.isGranted) {
    var result = await Permission.camera.request();
    if (!result.isGranted) {
      // 处理权限被拒绝的情况
      throw Exception('Camera permission is required.');
    }
  }
}

确保在你的pubspec.yaml文件中也添加了permission_handler依赖。

4. 使用条码扫描功能

下面是一个完整的示例,展示如何使用flutter_bar_scanner_alternative进行条码扫描:

import 'package:flutter/material.dart';
import 'package:flutter_bar_scanner_alternative/flutter_bar_scanner_alternative.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ScanPage(),
    );
  }
}

class ScanPage extends StatefulWidget {
  @override
  _ScanPageState createState() => _ScanPageState();
}

class _ScanPageState extends State<ScanPage> {
  String _scanResult = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Barcode Scanner'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Scan Result: $_scanResult',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                try {
                  await requestCameraPermission();
                  var result = await FlutterBarScannerAlternative.scanBarCode();
                  setState(() {
                    _scanResult = result;
                  });
                } catch (e) {
                  setState(() {
                    _scanResult = 'Error: ${e.toString()}';
                  });
                }
              },
              child: Text('Scan Barcode'),
            ),
          ],
        ),
      ),
    );
  }
}

5. 运行应用

确保你的设备或模拟器支持相机功能,然后运行你的Flutter应用。点击“Scan Barcode”按钮将启动条码扫描器,扫描成功后,结果将显示在屏幕上。

这个示例展示了如何集成和使用flutter_bar_scanner_alternative插件进行条码扫描。根据你的具体需求,你可能需要调整UI或错误处理逻辑。

回到顶部