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

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

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

QR/Bar Code Scanner Dialog

这是一个用于显示简单的扫描对话框并轻松捕获条形码或二维码的插件。它支持Android、iOS和Web平台。对于Web,它使用html5-qrcode js库;对于Android和iOS,则使用qr_code_scanner

特别注意

目前,这是唯一一个支持Flutter Web端进行条形码扫描的插件。

获取扫描的QR/Bar Code

当识别到二维码时,识别出的文本将通过函数回调onCode传递给开发者。

class _MyAppState extends State<MyApp> {

  final _qrBarCodeScannerDialogPlugin = QrBarCodeScannerDialog();
  String? code;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Builder(builder: (context) {
          return Material(
            child: Center(
              child: ElevatedButton(
                  onPressed: () {
                    _qrBarCodeScannerDialogPlugin.getScannedQrBarCode(
                        context: context,
                        onCode: (code) {
                          setState(() {
                            this.code = code;
                          });
                        });
                  },
                  child: Text(code ?? "Click me")),
            ),
          );
        }),
      ),
    );
  }
}

Android集成

为了使用此插件,请更新Gradle、Kotlin和Kotlin Gradle Plugin:

  • 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中将minSdkVersion 16改为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中的一个bug,正在跟踪解决:https://github.com/flutter/flutter/issues/72185

你可以通过在gradle.properties文件中添加android.enableDexingArtifactTransform=false来绕过这个问题。

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集成

无需更新任何内容,插件会自动将HTML内容附加到DOM中。

完整示例代码

以下是完整的示例代码,展示了如何在Flutter项目中使用qr_bar_code_scanner_dialog插件:

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

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  final _qrBarCodeScannerDialogPlugin = QrBarCodeScannerDialog();
  String? code;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Builder(builder: (context) {
          return Material(
            child: Center(
              child: ElevatedButton(
                  onPressed: () {
                    _qrBarCodeScannerDialogPlugin.getScannedQrBarCode(
                        context: context,
                        onCode: (code) {
                          setState(() {
                            this.code = code;
                          });
                        });
                  },
                  child: Text(code ?? "Click me")),
            ),
          );
        }),
      ),
    );
  }
}

这个示例创建了一个简单的Flutter应用,点击按钮后会弹出一个二维码或条形码扫描对话框,扫描成功后会在按钮上显示扫描结果。


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

1 回复

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


当然,下面是一个关于如何使用 qr_bar_code_scanner_dialog 插件在 Flutter 应用中实现二维码及条形码扫描功能的代码示例。这个插件提供了一个简单的方式来集成扫描功能,而无需深入处理相机权限和扫描逻辑。

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

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

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

接下来,在你的 Dart 文件中,你可以按照以下步骤实现扫描功能:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter QR/Bar Code Scanner Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ScanPage(),
    );
  }
}

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

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

  Future<void> _scanQRCode() async {
    String result = await QrBarCodeScannerDialog.scan();
    setState(() {
      _result = result;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR/Bar Code 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, color: Colors.blue),
            ),
            SizedBox(height: 40),
            ElevatedButton(
              onPressed: _scanQRCode,
              child: Text('Scan QR/Bar Code'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. MyApp 是应用的根 widget,它设置了应用的主题并定义了主页面为 ScanPage
  2. ScanPage 是一个有状态的 widget,它包含一个文本字段来显示扫描结果和一个按钮来触发扫描操作。
  3. _scanQRCode 方法使用 QrBarCodeScannerDialog.scan() 方法来启动扫描对话框。扫描完成后,结果会赋值给 _result 状态变量,并通过 setState 方法更新 UI。

这个简单的示例展示了如何使用 qr_bar_code_scanner_dialog 插件在 Flutter 应用中集成二维码和条形码扫描功能。你可以根据实际需求进一步扩展和定制这个示例。

回到顶部