Flutter二维码扫描插件flutter_bar_scanner_alternative2的使用

Flutter二维码扫描插件flutter_bar_scanner_alternative的使用

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

Demo gif

尝试示例

只需克隆或下载仓库,打开项目在Android Studio/VS Code,打开pubspec.yaml文件并点击Packages get。 连接设备并点击run。 要在iPhone上运行,你首先需要从Xcode运行并执行pod installexample/ios目录下,然后从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. 添加到现有项目

如果你现有的iOS代码是Swift,只需做以下操作:

  1. 设置最低部署目标为12和Swift版本为5。
  2. 关闭Xcode并在Flutter项目的/ios目录下运行pod install
  3. 然后进入下一节“如何使用”。

如果你现有的iOS代码是Objective-C,需要做以下操作:

  1. 在不同的位置创建一个新的Flutter项目(确保选择“包含Swift支持用于iOS代码”)。
  2. 复制新创建的/ios文件夹并替换现有的/ios文件夹。
  3. 打开Xcode项目,设置最低部署目标为12和Swift版本为5。
  4. /ios目录下运行pod install

注意:如果你之前对iOS部分进行了任何更改,可能需要再次进行这些配置。

如何使用?

为了在iOS上使用此插件,你需要添加相机使用描述。为此,请打开Xcode并编辑Info.plist文件:

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

在修改完Android和iOS部分之后,将flutter_bar_scanner_alternative添加到pubspec.yaml文件中:

dependencies:
  ...
  flutter_bar_scanner_alternative: ^2.0.0

单次扫描

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

scanBarcode中,

  • COLOR_CODE 是一个十六进制颜色值,代表条形码覆盖层的颜色。
  • CANCEL_BUTTON_TEXT 是取消按钮上的文本。
  • isShowFlashIcon 是一个布尔值,用于显示或隐藏闪光灯图标。
  • scanMode 是一个枚举值,可以传递QR, BARCODE, DEFAULT中的任何一个。如果没有传递,则默认值为QR

注意:当前scanMode仅用于显示条形码和QR码的图形覆盖层。无论选择了哪种模式,都会扫描这两种条形码。

持续扫描

如果需要持续扫描条形码而不关闭摄像头,可以使用FlutterBarScannerAlternative.getBarcodeStreamReceiver方法。参数与FlutterBarScannerAlternative.scanBarcode相同:

FlutterBarScannerAlternative.getBarcodeStreamReceiver("#ff6666", "Cancel", false, ScanMode.DEFAULT)
    .listen((barcode) { 
        // 使用扫描到的条形码
    });

贡献

欢迎贡献,如果你喜欢这个项目,请给它点个星。

联系

邮箱:amol.gangadhare@gmail.com


示例代码

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bar_scanner_alternative/flutter_bar_scanner_alternative.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 {
    FlutterBarScannerAlternative.getBarcodeStreamReceiver(
            '#ff6666', 'Cancel', true, ScanMode.BARCODE)!
        .listen((barcode) => print(barcode));
  }

  Future<void> scanQR() async {
    String barcodeScanRes;
    // 平台消息可能会失败,所以我们使用try/catch来捕获PlatformException。
    try {
      barcodeScanRes = await FlutterBarScannerAlternative.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;
    // 平台消息可能会失败,所以我们使用try/catch来捕获PlatformException。
    try {
      barcodeScanRes = await FlutterBarScannerAlternative.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('Barcode scan')),
            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('Start barcode scan')),
                        ElevatedButton(
                            onPressed: () => scanQR(),
                            child: Text('Start QR scan')),
                        ElevatedButton(
                            onPressed: () => startBarcodeScanStream(),
                            child: Text('Start barcode scan stream')),
                        Text('Scan result : $_scanBarcode\n',
                            style: TextStyle(fontSize: 20))
                      ]));
            })));
  }
}

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

1 回复

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


flutter_bar_scanner_alternative2 是一个用于在 Flutter 应用中扫描二维码和条形码的插件。它是 flutter_bar_scanner 插件的替代版本,提供了更简单的集成方式和更好的性能。以下是如何在 Flutter 项目中使用 flutter_bar_scanner_alternative2 插件的详细步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_bar_scanner_alternative2 的依赖。

dependencies:
  flutter:
    sdk: flutter
  flutter_bar_scanner_alternative2: ^1.0.0

然后,运行 flutter pub get 来获取依赖。

2. 配置 Android 和 iOS 项目

对于 Android 和 iOS 项目,你可能需要进行一些配置。

Android

android/app/build.gradle 文件中,确保 minSdkVersion 至少为 21:

defaultConfig {
    applicationId "com.example.yourapp"
    minSdkVersion 21
    targetSdkVersion 30
    versionCode 1
    versionName "1.0"
}

iOS

ios/Podfile 中,确保 platform 设置为 11.0 或更高:

platform :ios, '11.0'

然后,运行 flutter pub getflutter build ios 以确保所有依赖项都已正确配置。

3. 使用插件

在你的 Flutter 项目中,你可以使用 flutter_bar_scanner_alternative2 来扫描二维码和条形码。

示例代码

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

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

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

class ScannerScreen extends StatefulWidget {
  @override
  _ScannerScreenState createState() => _ScannerScreenState();
}

class _ScannerScreenState extends State<ScannerScreen> {
  String _scanResult = 'Scan a QR code or barcode';

  Future<void> _scanQR() async {
    try {
      final result = await FlutterBarScannerAlternative2.scan();
      setState(() {
        _scanResult = result ?? 'No result';
      });
    } catch (e) {
      setState(() {
        _scanResult = 'Failed to scan: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Scanner'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_scanResult),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _scanQR,
              child: Text('Scan QR Code'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

现在你可以运行你的 Flutter 应用,点击按钮来扫描二维码或条形码。扫描结果将会显示在屏幕上。

5. 处理权限

在某些设备上,你可能需要请求相机权限。你可以使用 permission_handler 插件来处理权限请求。

首先,添加 permission_handler 依赖:

dependencies:
  permission_handler: ^10.0.0

然后,在扫描之前请求相机权限:

import 'package:permission_handler/permission_handler.dart';

Future<void> _scanQR() async {
  var status = await Permission.camera.status;
  if (!status.isGranted) {
    await Permission.camera.request();
  }
  
  if (await Permission.camera.isGranted) {
    try {
      final result = await FlutterBarScannerAlternative2.scan();
      setState(() {
        _scanResult = result ?? 'No result';
      });
    } catch (e) {
      setState(() {
        _scanResult = 'Failed to scan: $e';
      });
    }
  } else {
    setState(() {
      _scanResult = 'Camera permission denied';
    });
  }
}
回到顶部