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

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

项目状态

该项目目前仅处于维护模式。由于该插件依赖的基础框架 zxing(用于Android)和 MTBBarcodeScanner(用于iOS)已经不再被维护,因此该插件也不再是最新的。只有在修复错误和进行小的增强时才会考虑更新。

我在开发一个新的插件 mobile_scanner,它使用最新的MLKit来检测条形码和二维码。在Android上,它还使用了最新的CameraX,并在iOS上使用了原生AVFoundation以获得最佳的相机性能。

二维码扫描器

QR Code Scanner

这是一个可以在iOS和Android上运行的二维码扫描器,通过在Flutter中嵌入平台视图实现。与跳转到原生Activity或ViewController相比,这种集成方式更加无缝,效果更好。

截图

Android

iOS

获取扫描的二维码

当识别出一个二维码时,扫描到的文本将存储在类型为 Barcoderesult 中,其中包含输出文本的属性 code 和扫描代码类型的属性 format,该属性是一个枚举 BarcodeFormat,定义在库中。

class _QRViewExampleState extends State<QRViewExample> {
  final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
  Barcode? result;
  QRViewController? controller;

  // 为了使热重载工作,如果平台是Android,则需要暂停相机,如果是iOS,则需要恢复相机。
  @override
  void reassemble() {
    super.reassemble();
    if (Platform.isAndroid) {
      controller!.pauseCamera();
    } else if (Platform.isIOS) {
      controller!.resumeCamera();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Expanded(
            flex: 5,
            child: QRView(
              key: qrKey,
              onQRViewCreated: _onQRViewCreated,
            ),
          ),
          Expanded(
            flex: 1,
            child: Center(
              child: (result != null)
                  ? Text(
                      'Barcode Type: ${describeEnum(result!.format)}   Data: ${result!.code}')
                  : Text('Scan a code'),
            ),
          )
        ],
      ),
    );
  }

  void _onQRViewCreated(QRViewController controller) {
    this.controller = controller;
    controller.scannedDataStream.listen((scanData) {
      setState(() {
        result = scanData;
      });
    });
  }

  @override
  void dispose() {
    controller?.dispose();
    super.dispose();
  }
}

Android集成

要使用此插件,请更新Gradle、Kotlin和Kotlin Gradle插件:

android/build.gradle 文件中,将 ext.kotlin_version = '1.3.50' 更改为 ext.kotlin_version = '1.5.10'

android/build.gradle 文件中,将 classpath 'com.android.tools.build:gradle:3.5.0' 更改为 classpath 'com.android.tools.build:gradle:4.2.0'

android/gradle/wrapper/gradle-wrapper.properties 文件中,将 distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip 更改为 distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip

android/app/build.gradle 文件中,将 defaultConfig{ minSdkVersion 16} 更改为 defaultConfig{ minSdkVersion 20}

警告

如果您正在使用Flutter Beta或Dev通道(1.25或1.26),可能会遇到以下错误:

java.lang.AbstractMethodError: abstract method "void io.flutter.plugin.platform.PlatformView.onFlutterViewAttached(android.view.View)"

这是一个Flutter中的错误,可以在此处跟踪:Flutter Issue #72185。可以通过在 gradle.properties 文件中添加 android.enableDexingArtifactTransform=false 来解决此问题。

iOS集成

要在iOS上使用此插件,请在您的 Info.plist 文件中添加以下内容:

<key>io.flutter.embedded_views_preview</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes</string>

Web集成

web/index.html 文件中添加以下内容:

<script src="https://cdn.jsdelivr.net/npm/jsqr@1.3.1/dist/jsQR.min.js"></script>

请注意:在Web平台上,只支持扫描QR码。其他条形码和二维码不被支持。

Web支持还在非常早期的阶段。诸如闪光灯、暂停或恢复等功能尚未实现。此外,相机预览可能不会遵守周围的约束。这主要是由于Flutter平台视图在Web上的早期状态。

翻转摄像头(后/前)

默认情况下,使用的是后置摄像头。

await controller.flipCamera();

开关闪光灯(开/关)

默认情况下,闪光灯是关闭的。

await controller.toggleFlash();

暂停/恢复

暂停相机流和扫描器。

await controller.pauseCamera();

恢复相机流和扫描器。

await controller.resumeCamera();

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

1 回复

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


custom_qr_code_scanner 是一个用于 Flutter 的二维码扫描插件。它提供了自定义二维码扫描界面的能力,允许开发者根据自己的需求定制扫描界面。以下是使用 custom_qr_code_scanner 的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 custom_qr_code_scanner 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  custom_qr_code_scanner: ^1.0.0  # 请使用最新的版本号

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

2. 导入插件

在需要使用二维码扫描功能的 Dart 文件中导入插件:

import 'package:custom_qr_code_scanner/custom_qr_code_scanner.dart';

3. 创建二维码扫描界面

你可以使用 CustomQrCodeScanner 来创建一个二维码扫描界面。以下是一个简单的示例:

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

class QRScannerScreen extends StatefulWidget {
  @override
  _QRScannerScreenState createState() => _QRScannerScreenState();
}

class _QRScannerScreenState extends State<QRScannerScreen> {
  final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
  QRViewController? controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Scanner'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            flex: 5,
            child: CustomQrCodeScanner(
              key: qrKey,
              onQRViewCreated: _onQRViewCreated,
            ),
          ),
          Expanded(
            flex: 1,
            child: Center(
              child: Text('Scan a QR code'),
            ),
          ),
        ],
      ),
    );
  }

  void _onQRViewCreated(QRViewController controller) {
    this.controller = controller;
    controller.scannedDataStream.listen((scanData) {
      // 处理扫描到的数据
      print('Scanned Data: ${scanData.code}');
      // 你可以在这里处理扫描到的数据,例如导航到另一个页面
    });
  }

  @override
  void dispose() {
    controller?.dispose();
    super.dispose();
  }
}

4. 导航到二维码扫描界面

在你的应用中,你可以通过导航的方式打开二维码扫描界面:

Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => QRScannerScreen()),
);

5. 处理扫描结果

_onQRViewCreated 方法中,你可以通过 controller.scannedDataStream 监听扫描到的数据,并根据需要进行处理。

6. 自定义界面

custom_qr_code_scanner 允许你自定义扫描界面。你可以通过设置不同的参数来调整扫描界面的外观和行为。例如,你可以自定义扫描框的大小、颜色、边框等。

7. 权限处理

在 Android 和 iOS 上,使用摄像头需要相应的权限。确保你已经在 AndroidManifest.xmlInfo.plist 中添加了摄像头权限。

Android:

<uses-permission android:name="android.permission.CAMERA" />

iOS:

<key>NSCameraUsageDescription</key>
<string>We need access to your camera to scan QR codes.</string>
回到顶部