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

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

qr_scanner_with_effect

qr_scanner_with_effect 是一个 Flutter 插件,用于扫描二维码,并且具有扫描效果。

QR Scanner with Effect

pub package GH Actions

Features

参数 定义
GlobalKey<State<StatefulWidget>> qrKey (必需) 唯一标识元素
void Function(QRViewController) onQrScannerViewCreated (必需) 当视图创建时调用
EdgeInsetsGeometry overlayMargin (预定义) 为覆盖层提供边距
CameraFacing cameraFacing (预定义) 设置启动时使用的摄像头,可以是 CameraFacing.frontCameraFacing.back
void Function(QRViewController, bool)? onPermissionSet (可选) 当权限设置时调用提供的回调
List<BarcodeFormat> formatsAllowed (预定义) 指定需要扫描的格式
Color qrOverlayBorderColor (必需) 二维码覆盖层边框的颜色
double qrOverlayBorderRadius (预定义) 二维码覆盖层边框的圆角
double qrOverlayBorderWidth (预定义) 二维码覆盖层边框的宽度
double qrOverlayBorderLength (预定义) 二维码覆盖层边框的长度
Gradient? effectGradient (可选) 用于从底部到顶部的动画颜色效果
double effectWidth (预定义) 效果的宽度
bool isScanComplete (预定义) 扫描完成后移除效果
Color? effectColor (可选) 效果的颜色
double? cutOutSize -
double? cutOutHeight -
double? cutOutWidth -
double cutOutBottomOffset -

Demo

ezgif com-optimize

Installation

pubspec.yaml 文件中添加依赖:

dependencies:
  qr_scanner_with_effect: latest

或者使用命令行:

flutter pub add qr_scanner_with_effect

Usage

QrScannerWithEffect(
  isScanComplete: isComplete,
  qrKey: qrKey,
  onQrScannerViewCreated: onQrScannerViewCreated,
  qrOverlayBorderColor: Colors.redAccent,
  cutOutSize: (MediaQuery.of(context).size.width < 300 || MediaQuery.of(context).size.height < 400) ? 250.0 : 300.0,
  onPermissionSet: (ctrl, p) => onPermissionSet(context, ctrl, p),
  effectGradient: const LinearGradient(
    begin: Alignment.topCenter,
    end: Alignment.bottomCenter,
    stops: [0.0, 1],
    colors: [
      Colors.redAccent,
      Colors.redAccent,
    ],
  ),
)

Additional Information

此包基于 qr_code_scanner 构建。当我们使用 qr_scanner_with_effect 包时,我们还使用 qr_code_scanner 包来获取其控制器。

示例代码

import 'package:flutter/material.dart';
import 'dart:developer';
import 'dart:io';
import 'package:qr_code_scanner/qr_code_scanner.dart';
import 'package:qr_scanner_with_effect/qr_scanner_with_effect.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: ExampleScreen(),
    );
  }
}

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

  @override
  State<ExampleScreen> createState() => _ExampleScreenState();
}

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

  bool isComplete = false;

  void onQrScannerViewCreated(QRViewController controller) {
    this.controller = controller;
    controller.scannedDataStream.listen((scanData) async {
      result = scanData;
      controller.pauseCamera();

      await Future<void>.delayed(const Duration(milliseconds: 300));

      String? myQrCode = result?.code != null && result!.code.toString().isNotEmpty ? result?.code.toString() : '';
      if (myQrCode != null && myQrCode.isNotEmpty) {
        manageQRData(myQrCode);
      }
    });
  }

  void manageQRData(String myQrCode) async {
    controller?.stopCamera();
    setState(() {
      isComplete = true;
    });
  }

  @override
  void reassemble() {
    if (Platform.isAndroid) {
      controller!.pauseCamera();
    } else if (Platform.isIOS) {
      controller!.resumeCamera();
    }
    super.reassemble();
  }

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

  void onPermissionSet(BuildContext context, QRViewController ctrl, bool p) {
    log('${DateTime.now().toIso8601String()}_onPermissionSet $p');
    if (!p) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('no Permission')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      top: false,
      bottom: false,
      child: Scaffold(
        extendBodyBehindAppBar: true,
        backgroundColor: Colors.transparent,
        body: LayoutBuilder(
          builder: (BuildContext context, BoxConstraints constraints) {
            return QrScannerWithEffect(
              isScanComplete: isComplete,
              qrKey: qrKey,
              onQrScannerViewCreated: onQrScannerViewCreated,
              qrOverlayBorderColor: Colors.redAccent,
              cutOutSize: (MediaQuery.of(context).size.width < 300 || MediaQuery.of(context).size.height < 400) ? 250.0 : 300.0,
              onPermissionSet: (ctrl, p) => onPermissionSet(context, ctrl, p),
              effectGradient: const LinearGradient(
                begin: Alignment.topCenter,
                end: Alignment.bottomCenter,
                stops: [0.0, 1],
                colors: [
                  Colors.redAccent,
                  Colors.redAccent,
                ],
              ),
            );
          },
        ),
      ),
    );
  }
}

以上代码展示了如何使用 qr_scanner_with_effect 插件来实现二维码扫描功能,并且包含了扫描效果。希望对你有所帮助!


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

1 回复

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


当然,以下是如何在Flutter项目中使用qr_scanner_with_effect插件的一个基本示例。这个插件允许你以带有特效的方式扫描二维码。首先,你需要确保在pubspec.yaml文件中添加了该插件的依赖。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  qr_scanner_with_effect: ^最新版本号  # 请替换为实际发布的最新版本号

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

2. 配置权限

由于二维码扫描需要访问相机,你需要在AndroidManifest.xmlInfo.plist中配置相应的权限。

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>需要访问相机以扫描二维码</string>

3. 使用插件

接下来,在你的Flutter项目中创建一个页面来使用qr_scanner_with_effect插件。

示例代码

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

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

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

class QRScanPage extends StatefulWidget {
  @override
  _QRScanPageState createState() => _QRScanPageState();
}

class _QRScanPageState extends State<QRScanPage> {
  final QRScannerController qrScannerController = QRScannerController();
  String qrCodeResult = "";

  @override
  void initState() {
    super.initState();
    qrScannerController.initialize().then((_) {
      if (!mounted) return;
      qrScannerController.startScanning(
        onCapture: (result) {
          setState(() {
            qrCodeResult = result;
          });
          qrScannerController.stopScanning();
        },
        onError: (error) {
          print("QR Scanner error: $error");
        },
      );
    });
  }

  @override
  void dispose() {
    qrScannerController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("QR Scanner with Effect"),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Expanded(
            child: QRScanView(
              controller: qrScannerController,
              effect: QREffect.colorScanEffect(
                scanLineColor: Colors.blue,
                scanBoxColor: Colors.redAccent,
              ),
            ),
          ),
          SizedBox(height: 20),
          Text(
            "Scanned Result: $qrCodeResult",
            style: TextStyle(fontSize: 20),
          ),
        ],
      ),
    );
  }
}

4. 运行应用

确保你已经连接了一个支持相机的设备或模拟器,然后运行你的Flutter应用:

flutter run

这个示例展示了如何使用qr_scanner_with_effect插件进行二维码扫描,并在扫描到二维码后显示结果。你可以根据需要自定义扫描特效和UI。

回到顶部