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

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

quick_qr 是一个用于在Android和iOS上扫描二维码的Flutter插件。以下是该插件的使用方法和详细说明。

参数和函数

CameraSource 类的参数和函数如下:

参数 类型 功能 默认值
onDetect 必须 当成功检测到条形码时,条形码数据将在此函数中可用 -
immersive 可选 设置为false以退出全屏模式 true
stopOnFound 可选 如果为true,则扫描窗口会自动关闭 false
resolution 可选 影响视频录制和图像捕获的质量 high

使用方法

import 'package:quick_qr/quick_qr.dart';

Navigator.of(context).push(
  MaterialPageRoute(
    maintainState: false,
    builder: (context) {
      return CameraSource(
        immersive: false,
        stopOnFound: true,
        onDetect: (barcode) async {
          // 处理二维码数据
        },
      );
    },
  ),
);

检测到的二维码数据

onDetect: (barcode) async {
  // 访问二维码数据
}
参数 类型 描述
barcode.value - 根据设置的BarcodeType类型的不同,返回不同的条形码值
barcode.type - 条形码的格式类型
barcode.rawValue - 条形码编码后的原始值
barcode.rawBytes - 条形码编码后的字节
barcode.format - 条形码值的格式(符号学)
barcode.displayValue - 用户友好的条形码值,可能包含多行,例如当原始文本中的换行符被编码进条形码时。也可能包括补充值。

示例代码

以下是一个完整的示例代码,展示了如何使用quick_qr插件来扫描二维码并在应用中显示其内容。

import 'package:flutter/material.dart';
import 'package:flutter_linkify/flutter_linkify.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:quick_qr/quick_qr.dart';
import 'package:url_launcher/url_launcher.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Qr code scanner',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Qr code scanner Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _qrCodeData = "";
  String? _qrCodeFormat;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _qrCodeData.isEmpty ? 'Qr code data will be shown here.' : "",
            ),
            const SizedBox(
              height: 10,
            ),
            Visibility(
              visible: _qrCodeData.isNotEmpty,
              child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Text.rich(TextSpan(children: [
                    const TextSpan(
                        text: "Qr code format: ",
                        style: TextStyle(fontWeight: FontWeight.bold)),
                    TextSpan(text: "$_qrCodeFormat")
                  ]))),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Linkify(
                text: _qrCodeData,
                onOpen: (link) async {
                  String url = link.url;
                  final uri = Uri.parse(url);
                  if (await canLaunchUrl(uri)) {
                    await launchUrl(uri);
                  } else {
                    Fluttertoast.showToast(msg: "Could not launch url");
                  }
                },
                linkStyle: TextStyle(color: Colors.blue[400]),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
          onPressed: () {
            if (mounted) {
              setState(() {
                _qrCodeData = "";
                _qrCodeFormat = "";
              });
            }

            Navigator.of(context).push(
              MaterialPageRoute(
                maintainState: false,
                builder: (context) {
                  return CameraSource(
                    immersive: false,
                    stopOnFound: true,
                    onDetect: (barcode) async {
                      if (mounted) {
                        setState(() {
                          _qrCodeData = barcode.displayValue!;
                          _qrCodeFormat = barcode.format.name;
                        });
                      }

                      Navigator.pop(context);
                    },
                  );
                },
              ),
            );
          },
          tooltip: 'Open QrCode scanner',
          child: const Icon(Icons.qr_code)),
    );
  }
}

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

1 回复

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


当然,quick_qr 并不是一个广泛认知的 Flutter 插件,通常用于二维码生成与扫描的插件是 qr_flutterbarcode_scan。不过,为了展示如何在 Flutter 中实现二维码的生成与扫描,我将分别使用 qr_flutter 来生成二维码,以及 barcode_scan 来扫描二维码。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  qr_flutter: ^4.0.0  # 确保使用最新版本
  barcode_scan: ^5.0.0  # 确保使用最新版本

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

2. 生成二维码

接下来,创建一个 Flutter 页面来生成二维码。下面是一个简单的示例:

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

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

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

class QrPage extends StatelessWidget {
  final String qrData = "https://www.example.com";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Generator'),
      ),
      body: Center(
        child: QrImage(
          data: qrData,
          version: QrVersions.auto,
          size: 200.0,
        ),
      ),
    );
  }
}

3. 扫描二维码

然后,创建一个 Flutter 页面来扫描二维码。下面是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:barcode_scan/barcode_scan.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 _result = "No result";

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

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

4. 请求相机权限(Android 和 iOS)

在扫描二维码时,应用需要访问设备的相机。你需要在 Android 和 iOS 上分别配置相机权限。

Android

android/app/src/main/AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

iOS

ios/Runner/Info.plist 中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>Need camera access to scan QR codes</string>

总结

以上代码展示了如何使用 qr_flutter 插件生成二维码,以及如何使用 barcode_scan 插件扫描二维码。确保你的 Flutter 环境已经正确配置,并且已经添加了必要的依赖和权限配置。

回到顶部