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

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

前言

在使用此插件之前,请确保为相机和图库设置权限。

特性

  • 使用ScannerView在小部件树中显示扫描视图。
  • 自定义可识别区域。
  • 通过ScannerController.getQrFromImage从图像路径解码二维码。

准备工作

iOS

info.plist文件中添加以下权限描述:

<key>NSCameraUsageDescription</key>
<string>你的使用描述</string>
<key>NSMicrophoneUsageDescription</key>
<string>你的使用描述</string>
Android

AndroidManifest.xml文件中添加相机权限:

<uses-permission android:name="android.permission.CAMERA" />

pubspec.yaml文件中添加依赖项:

dependencies:
  perfect_scanner: ^newest

导入必要的包:

import 'package:perfect_scanner/perfect_scanner.dart';

使用方法

显示ScannerView

在小部件树中使用ScannerView来展示扫描界面:

Container(
  width: 250, 
  height: 250,
  child: ScannerView(
   qrOverlay: QrOverlay(
     borderColor: Colors.green,
     borderWidth: 15,
     borderRadius: 10,
     cutOutSize: 300,
   ),
   onScan: (image) {
     if (image.isNotEmpty) {
       ScaffoldMessenger.of(context).showSnackBar(
         SnackBar(
           content: Text('QR DATA : $image'),
         ),
       );
     }
   },
 ),
)
暂停或恢复扫描

可以使用ScannerController.resumeScanning()ScannerController.pauseScanning()来控制摄像头的开启与关闭:

ScannerController.resumeScanning();
ScannerController.pauseScanning();
从图像路径获取二维码字符串

使用ScannerController.getQrFromImage方法从图像路径中获取二维码字符串:

String result = await ScannerController.getQrFromImage(imagePath);
切换闪光灯

使用ScannerController.toggleFlash()方法切换闪光灯:

ScannerController.toggleFlash();

示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用perfect_scanner插件。

import 'package:flutter/material.dart';
import 'package:perfect_scanner/perfect_scanner.dart';
import 'package:permission_handler/permission_handler.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    permissionHandler();
    super.initState();
  }

  permissionHandler() async {
    Permission status = Permission.camera;
    await status.request();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Builder(builder: (context) {
            return ElevatedButton(
              onPressed: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (_) => const CamView()));
              },
              child: const Text('前往扫描页面'),
            );
          }),
        ),
      ),
    );
  }
}

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

  [@override](/user/override)
  State<CamView> createState() => _CamViewState();
}

class _CamViewState extends State<CamView> {
  bool isFlashOn = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: [
          IconButton(
            onPressed: () async {
              final image = await ScannerController.getQrFromImage();
              debugPrint(image);
            },
            icon: const Icon(
              Icons.image,
              color: Colors.white,
            ),
          ),
          IconButton(
            onPressed: () async {
              ScannerController.resumeScanning();
              isFlashOn = await ScannerController.toggleFlash();
              setState(() {});
            },
            icon: Icon(
              isFlashOn ? Icons.flashlight_off : Icons.flashlight_on,
              color: Colors.white,
            ),
          ),
        ],
      ),
      body: SizedBox(
        width: MediaQuery.of(context).size.width,
        child: ScannerView(
          qrOverlay: QrOverlay(
            borderColor: Colors.green,
            borderWidth: 15,
            borderRadius: 10,
            cutOutSize: 300,
          ),
          onScan: (image) {
            if (image.isNotEmpty) {
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(
                  content: Text('QR DATA : $image'),
                ),
              );
            }
          },
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用perfect_scanner插件进行二维码扫描的代码示例。这个插件提供了一个简单且功能强大的方式来扫描二维码和条形码。

步骤 1: 添加依赖

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

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

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

步骤 2: 导入插件并配置权限

在你的主Dart文件(通常是main.dart)中,导入perfect_scanner插件,并配置必要的权限(如相机权限)。

import 'package:flutter/material.dart';
import 'package:perfect_scanner/perfect_scanner.dart';
import 'package:permission_handler/permission_handler.dart';

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

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

class ScannerPage extends StatefulWidget {
  @override
  _ScannerPageState createState() => _ScannerPageState();
}

class _ScannerPageState extends State<ScannerPage> {
  late ScannerController _scannerController;

  @override
  void initState() {
    super.initState();
    _initScanner();
  }

  Future<void> _initScanner() async {
    // 请求相机权限
    var status = await Permission.camera.status;
    if (!status.isGranted) {
      var result = await Permission.camera.request();
      if (!result.isGranted) {
        // 权限被拒绝,显示提示信息或退出应用
        return;
      }
    }

    // 初始化ScannerController
    _scannerController = ScannerController(
      scanOptions: ScanOptions(
        beepEnable: true, // 扫描成功时发出声音
        autoFocus: true,  // 自动对焦
      ),
      onResult: (result) {
        // 扫描结果回调
        print("Scanned Result: ${result.rawContent}");
        Navigator.of(context).pop(); // 扫描成功后返回
      },
    );

    _scannerController.initialize();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('二维码扫描'),
      ),
      body: Center(
        child: _scannerController.isInitialized
            ? ScannerView(_scannerController)
            : CircularProgressIndicator(),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(MaterialPageRoute(
            builder: (context) => ScannerView(_scannerController),
          ));
        },
        tooltip: '扫描',
        child: Icon(Icons.scan_wi_fi),
      ),
    );
  }

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

步骤 3: 运行应用

确保你的设备或模拟器具有相机权限,并运行你的Flutter应用。点击浮动操作按钮(FAB)将打开二维码扫描视图。扫描成功后,扫描结果将打印到控制台,并且页面会返回到主视图。

注意事项

  1. 权限处理:在生产环境中,确保你妥善处理了权限请求的结果,比如当用户拒绝权限时提供适当的反馈。
  2. 错误处理:在初始化ScannerController或扫描过程中添加错误处理逻辑,以处理可能出现的异常。
  3. UI优化:根据应用需求自定义扫描页面的UI,比如添加自定义的覆盖层、指示器等。

这个示例展示了如何使用perfect_scanner插件进行基本的二维码扫描功能。根据你的具体需求,你可以进一步扩展和优化这个基础实现。

回到顶部