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

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

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

标题

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

内容

QR.Flutter 是一个用于在 Flutter 中简单快速渲染二维码的库,通过 Widget 或自定义画笔实现。

需要帮助?

请不要提交关于“如何…?”或“什么是…?”类型的问题。这些问题几乎会被立即关闭。如果您有疑问,请在讨论板或 Stack Overflow 上提问。那里会有人回答您的问题。使用问题会造成大量噪音,并导致真正的问题解决得更慢。

特性

  • 无null安全性
  • 自动检测 QR 码版本/类型或手动输入
  • 支持 QR 码版本 1 - 40
  • 错误校正 / 冗余
  • 可配置输出大小、边距、背景和前景颜色
  • 支持图像叠加
  • 导出为图像数据以保存到文件或内存中
  • 不需要互联网连接

安装

兼容性版本: 4.0.0+ 支持 null 安全性,并且需要与 Flutter 兼容的版本。 如果使用的 Flutter 版本不兼容,请使用此库的 3.x 版本。

您应该将以下内容添加到您的 pubspec.yaml 文件中:

dependencies:
  qr_flutter: ^4.1.0

接下来,要渲染基本的二维码可以使用以下代码(或类似代码):

QrImageView(
  data: '1234567890',
  version: QrVersions.auto,
  size: 200.0,
),

根据您的数据需求,您可以调整二维码输出。可用的选项如下:

属性 类型 描述
version int QrVersions.auto 或者 1 到 40 之间的值。有关限制和详细信息,请参阅 http://www.qrcode.com/en/about/version.html
errorCorrectionLevel int 定义在 QrErrorCorrectLevel 上的一个值。例如:QrErrorCorrectLevel.L
size double 图像的 (方形) 大小。如果没有指定,则将自动大小化以满足最短尺寸约束。
padding EdgeInsets 周围二维码数据的填充。
backgroundColor Color 背景颜色(默认为无)。
eyeStyle QrEyeStyle 配置二维码眼睛(角落)的形状和颜色。
dataModuleStyle QrDataModuleStyle 配置点的形状和颜色。
gapless bool 添加额外像素以防止间隙(默认为 true)。
errorStateBuilder QrErrorBuilder 允许显示错误状态 Widget 在渲染二维码时发生错误(例如:版本太低,输入太长等)。
constrainErrorBounds bool 如果为真,错误 Widget 将被限制在二维码应绘制的正方形内。如果为假,错误状态 Widget 将根据需要生长/缩小。
embeddedImage ImageProvider 定义嵌入图像的 ImageProvider
embeddedImageStyle QrEmbeddedImageStyle 嵌入图像的样式属性。
embeddedImageEmitsError bool 如果为真,加载嵌入图像失败时将触发 errorStateBuilder 或显示空 Container。如果为假,二维码将被渲染并且嵌入图像将被忽略。
semanticsLabel String semanticsLabel 将由屏幕阅读器用来描述二维码的内容。
borderRadius double 设置形状类型 <code>QrEyeShape.square</code>QrDataModuleShape.squareEmbeddedImageShape.square 的的角半径。设置在适当的样式中。
roundedOutsideCorners bool 如果为真,数据的外角将被圆角。默认为 QrDataModuleStyle。外角圆角至 borderRadius。仅适用于 QrDataModuleShape.square
outsideBorderRadius double 如果外圆角 outsideBorderRadius 应该不同于内圆角 borderRadius。最多为 borderRadius。仅适用于 QrDataModuleShape.square
gradient Gradient 将固体颜色更改为渐变,例如 LinearGradient
safeArea bool 如果为真,数据隐藏在 embeddedImage 后面。设置为 QrEmbeddedImageStyle
safeAreaMultiplier double safeArea 大小的乘数。

示例

有一个简单的、工作的 Flutter 应用程序位于 /example 目录中。您可以使用它来玩转所有选项。

此外,以下示例为您提供了一个快速概览,说明如何使用该库。

一个基本的二维码看起来像这样:

QrImageView(
  data: 'This is a simple QR code',
  version: QrVersions.auto,
  size: 320,
  gapless: false,
)

一个带有嵌入图像(来自应用程序资源)的二维码看起来像这样:

QrImageView(
  data: 'This QR code has an embedded image as well',
  version: QrVersions.auto,
  size: 320,
  gapless: false,
  embeddedImage: AssetImage('assets/images/my_embedded_image.png'),
  embeddedImageStyle: QrEmbeddedImageStyle(
    size: Size(80, 80),
  ),
)

为了显示二维码无法验证时的错误状态:

QrImageView(
  data: 'This QR code will show the error state instead',
  version: 1,
  size: 320,
  gapless: false,
  errorStateBuilder: (context, error) {
    return Container(
      child: Center(
        child: Text(
          'Uh oh! Something went wrong...',
          textAlign: TextAlign.center,
        ),
      ),
    );
  },
)

一个具有内部和外部角落圆角以及嵌入图像安全区域的二维码:

QrImageView(
  data: 'London is the capital of Great Britain',
  version: QrVersions.auto,
  size: 320,
  eyeStyle: const QrEyeStyle(
    borderRadius: 10,
  ),
  dataModuleStyle: const QrDataModuleStyle(
    borderRadius: 5,
    roundedOutsideCorners: true,
  ),
  embeddedImage: AssetImage('assets/images/my_embedded_image.png'),
  embeddedImageStyle: QrEmbeddedImageStyle(
    size: Size.square(40),
    color: Colors.white,
    safeArea: true,
    safeAreaMultiplier: 1.1,
    embeddedImageShape: EmbeddedImageShape.square,
    borderRadius: 10,
  ),
)

一个具有渐变的二维码:

QrImageView(
  data: 'Rainbow after the rain',
  version: QrVersions.auto,
  size: 320,
  gradient: LinearGradient(
    begin: Alignment.bottomLeft,
    end: Alignment.topRight,
    colors: [
      Color(0xffff0000),
      Color(0xffffa00),
      Color(0xffffff00),
      Color(0xff008000),
      Color(0xff0000ff),
      Color(0xff4b0082),
      Color(0xffee82ee),
    ],
  ),
)

结束语

感谢 wanogho confidence 提供的 awesome [QR - Dart] 库。它是这个库的核心。

有关作者/贡献者信息,请参阅 AUTHORS 文件。

许可证

QR.Flutter 发布在 BSD-3 许可证下。详情请参阅 LICENSE 文件。


示例代码

/*
 * QR.Flutter
 * Copyright (c) 2019 the QR.Flutter authors.
 * See LICENSE for distribution and usage details.
 */

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

import 'main_screen.dart';

void main() =&gt; runApp(ExampleApp());

/// The example application class
class ExampleApp extends StatelessWidget {
  // This widget is the root of your application.
  [@override](/user/override)
  Widget build(BuildContext context) {
    SystemChrome.setSystemUIOverlayStyle(
      const SystemUiOverlayStyle(
        statusBarColor: Colors.white,
        statusBarIconBrightness: Brightness.dark,
        systemNavigationBarColor: Colors.white,
        systemNavigationBarIconBrightness: Brightness.dark,
      ),
    );
    return MaterialApp(
      title: 'QR.Flutter',
      theme: ThemeData.light(),
      debugShowCheckedModeBanner: false,
      home: MainScreen(),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用qr_flutter_new插件来生成和扫描二维码的示例代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  qr_flutter_new: ^4.0.0  # 请检查最新版本号

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

2. 生成二维码

下面是一个简单的示例,展示如何使用qr_flutter_new来生成一个二维码:

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

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

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

class QRCodeGenerator extends StatelessWidget {
  final String qrCodeData = "https://flutter.dev";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Generator'),
      ),
      body: Center(
        child: QrImage(
          data: qrCodeData,
          version: QrVersions.auto,
          size: 200.0,
          color: Colors.black,
          embeddedImage: AssetImage('assets/logo.png'), // 可选,嵌入小图标
          embeddedImageStyle: QrEmbeddedImageStyle(
            size: Size.square(40.0),
          ),
        ),
      ),
    );
  }
}

在这个例子中,QrImage组件用于生成二维码,data属性指定了二维码包含的数据。你还可以调整versionsizecolor等属性来定制二维码的外观。

3. 扫描二维码

为了扫描二维码,你需要使用qr_code_scanner插件(注意这不是qr_flutter_new的功能,但通常这两个功能会一起使用)。首先,添加依赖:

dependencies:
  qr_code_scanner: ^0.6.1  # 请检查最新版本号

然后,你可以创建一个扫描二维码的页面:

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

class QRCodeScannerPage extends StatefulWidget {
  @override
  _QRCodeScannerPageState createState() => _QRCodeScannerPageState();
}

class _QRCodeScannerPageState extends State<QRCodeScannerPage> {
  final BarcodeScannerController _controller = BarcodeScannerController();
  final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
  String? result = '';

  @override
  void reassemble() {
    super.reassemble();
    if (Platform.isAndroid) {
      _controller?.pauseCamera();
    }
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Scanner'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            flex: 5,
            child: QRView(
              key: qrKey,
              controller: _controller,
            ),
          ),
          Expanded(
            flex: 1,
            child: Center(
              child: Text(
                '$result',
                style: TextStyle(fontSize: 20),
              ),
            ),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          String? result = await _controller.scan();
          setState(() {
            this.result = result;
          });
        },
        tooltip: 'Scan',
        child: Icon(Icons.scan_wifi),
      ),
    );
  }
}

在这个例子中,QRView组件用于显示相机预览,并通过_controller来控制扫描过程。当用户点击浮动按钮时,将触发扫描操作,并将结果显示在屏幕上。

4. 整合生成与扫描功能

最后,你可以在一个应用中整合生成和扫描二维码的功能。例如,通过导航器在应用的不同页面之间切换:

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

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

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

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

在这个整合的例子中,HomePage包含两个按钮,分别用于导航到生成二维码和扫描二维码的页面。

希望这些代码示例能帮助你在Flutter应用中实现二维码的生成和扫描功能!

回到顶部