Flutter二维码生成与扫描插件native_qr的使用

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

Flutter二维码生成与扫描插件native_qr的使用

native_qr 是一个简单易用的Flutter插件,用于在iOS和Android平台上进行二维码扫描。该插件利用了原生操作系统的二维码扫描功能。

开始使用

1. 安装插件

在你的Flutter项目中添加native_qr插件:

$ flutter pub add native_qr

2. 导入插件

在需要使用的Dart文件中导入插件:

import 'package:native_qr/native_qr.dart';

3. 调用get()方法

通过调用get()方法来启动二维码扫描:

try {
  NativeQr nativeQr = NativeQr();
  String? result = await nativeQr.get();  
} catch(err) {
  print(err);
}

平台注意事项

iOS

  • 需要在Info.plist中设置相机权限描述:
    <key>NSCameraUsageDescription</key>
    <string>We need access to the camera to scan QR codes.</string>
    
  • 插件使用的是DataScannerViewController,要求iOS版本至少为16.0。
  • 设备必须配备A12 Bionic芯片或更新型号。

Android

  • 最低SDK版本要求:
    minSdkVersion 21
    targetSdkVersion 33
    
  • AndroidManifest.xml中添加以下元数据以自动加载Google Play服务:
    <application ...>
      ...
      <meta-data
          android:name="com.google.mlkit.vision.DEPENDENCIES"
          android:value="barcode_ui"/>
      ...
    </application>
    

错误处理

插件可能会抛出以下异常:

  1. CANCELED:扫描操作被取消。
  2. ERROR:发生了一些错误。
  3. UNKNOWN:未知错误。

限制和已知问题

  1. 仅支持QR码。
  2. iOS实现自16.0开始可用。
  3. 仅提供QR编码数据的字符串表示形式。
  4. 结果仅包含视场内的一个QR码。
  5. 不支持iOS多场景应用。

示例Demo

下面是一个完整的示例代码,展示了如何在Flutter应用中集成native_qr插件进行二维码扫描:

import 'package:flutter/material.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 _nativeQr = NativeQr();
  String? qrString;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('NativeQrPlugin example app'),
        ),
        body: Container(
            alignment: Alignment.center,
            child: Column(
              children: [
                ElevatedButton(
                  onPressed: () async {
                    try {
                      var result = await _nativeQr.get();
                      setState(() {
                        qrString = result;
                      });
                    } catch (err) {
                      setState(() {
                        qrString = err.toString();
                      });
                    }
                  },
                  child: const Text("Scan"),
                ),
                Text(qrString ?? "No data")
              ],
            )),
      ),
    );
  }
}

这个示例创建了一个简单的Flutter应用,用户点击“Scan”按钮后可以启动二维码扫描,并在界面上显示扫描结果。


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用native_qr插件来生成和扫描二维码的代码示例。native_qr插件通常分为两个部分:生成二维码和扫描二维码。为了简单起见,我会分别提供这两个功能的代码示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  native_qr: ^0.x.x  # 请注意使用最新版本号

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

2. 生成二维码

接下来,我们编写生成二维码的代码。在lib目录下创建一个新的Dart文件,例如qr_code_generator.dart,并添加以下代码:

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

class QRCodeGenerator extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Generator'),
      ),
      body: Center(
        child: QRCodeGeneratorWidget(),
      ),
    );
  }
}

class QRCodeGeneratorWidget extends StatefulWidget {
  @override
  _QRCodeGeneratorWidgetState createState() => _QRCodeGeneratorWidgetState();
}

class _QRCodeGeneratorWidgetState extends State<QRCodeGeneratorWidget> {
  final String qrCodeText = "https://www.example.com";

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Generated QR Code for: $qrCodeText'),
        SizedBox(height: 20),
        QrCodeGenerator(
          value: qrCodeText,
          size: 200,
        ),
      ],
    );
  }
}

3. 扫描二维码

接下来,我们编写扫描二维码的代码。在lib目录下创建另一个Dart文件,例如qr_code_scanner.dart,并添加以下代码:

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

class QRCodeScanner extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Scanner'),
      ),
      body: QRCodeScannerWidget(),
    );
  }
}

class QRCodeScannerWidget extends StatefulWidget {
  @override
  _QRCodeScannerWidgetState createState() => _QRCodeScannerWidgetState();
}

class _QRCodeScannerWidgetState extends State<QRCodeScannerWidget> {
  String qrCodeResult = "";

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Scanned QR Code Result: $qrCodeResult'),
        SizedBox(height: 20),
        QrCodeScanner(
          onCapture: (result) {
            setState(() {
              qrCodeResult = result.text;
            });
          },
        ),
      ],
    );
  }
}

4. 主程序入口

最后,我们在main.dart中引入这两个组件,并提供一个导航到它们的界面:

import 'package:flutter/material.dart';
import 'qr_code_generator.dart';
import 'qr_code_scanner.dart';

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

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

class MainScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => QRCodeGenerator()),
                );
              },
              child: Text('Generate QR Code'),
            ),
            SizedBox(height: 20),
            TextButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => QRCodeScanner()),
                );
              },
              child: Text('Scan QR Code'),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 权限处理:对于二维码扫描功能,你可能需要在AndroidManifest.xmlInfo.plist中添加相应的权限配置。
  2. 错误处理:为了更健壮的代码,你应该添加错误处理逻辑,例如处理扫描失败或生成二维码失败的情况。

这样,你就完成了一个基本的Flutter应用,可以生成和扫描二维码。希望这些代码对你有帮助!

回到顶部