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

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

这是用于Flutter的一个简单二维码扫描插件。它通过摄像头扫描二维码并返回结果字符串。

该插件的基础原生扫描器是ZXing。

完整示例Demo

以下是一个完整的示例代码,展示了如何在Flutter应用中使用qr_scanner_flutter插件来实现二维码扫描功能。

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

import 'package:flutter/services.dart';
import 'package:flutter_qr_scanner_example/qr_scan_view.dart';
import 'package:qr_scanner_flutter/qr_scanner_flutter.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> {
  String _platformVersion = '未知';
  final _flutterQrScanPlugin = FlutterQrScanner();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 异步方法初始化平台状态
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用try/catch处理PlatformException。
    // 我们还处理了消息可能返回null的情况。
    try {
      platformVersion = await _flutterQrScanPlugin.getPlatformVersion() ?? 
          '未知平台版本';
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果小部件在异步平台消息还在飞行时从树中移除,我们希望丢弃回复而不是调用
    // setState来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('二维码扫描插件示例'),
        ),
        body: SafeArea(
          child: Column(
            children: [
              Center(
                child: Text('运行于: $_platformVersion\n'),
              ),
              Builder(builder: (context) {
                return ElevatedButton(
                  onPressed: () async {
                    Navigator.of(context).push(
                      MaterialPageRoute(
                        builder: (context) => const QRScanView(),
                      ),
                    );
                  },
                  child: const Text('开始扫描'),
                );
              }),
            ],
          ),
        ),
      ),
    );
  }
}

扫描页面 QRScanView

接下来是扫描页面QRScanView的代码。这个页面负责展示摄像头界面,并进行二维码扫描。

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

class QRScanView extends StatefulWidget {
  const QRScanView({Key? key}) : super(key: key);

  [@override](/user/override)
  _QRScanViewState createState() => _QRScanViewState();
}

class _QRScanViewState extends State<QRScanView> {
  late FlutterQrScanner _flutterQrScanner;

  [@override](/user/override)
  void initState() {
    super.initState();
    _flutterQrScanner = FlutterQrScanner(onScanResult: (result) {
      // 当扫描到二维码时触发的回调
      print("Scanned data: $result");
      // 这里可以添加更多逻辑,例如导航到另一个页面或显示一个对话框
      Navigator.of(context).pop(result);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('扫描二维码'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            _flutterQrScanner.startScan();
          },
          child: const Text('打开摄像头开始扫描'),
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    _flutterQrScanner.dispose(); // 释放资源
    super.dispose();
  }
}

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

1 回复

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


qr_scanner_flutter 是一个用于在 Flutter 应用中扫描二维码的插件。它基于 camera 插件和 zxing 库,提供了简单易用的 API 来实现二维码扫描功能。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 qr_scanner_flutter 依赖:

dependencies:
  flutter:
    sdk: flutter
  qr_scanner_flutter: ^1.0.0  # 请使用最新版本

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

2. 配置相机权限

在 Android 和 iOS 上,使用相机需要相应的权限。确保在 AndroidManifest.xmlInfo.plist 中添加相机权限。

Android (android/app/src/main/AndroidManifest.xml):

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

iOS (ios/Runner/Info.plist):

<key>NSCameraUsageDescription</key>
<string>需要相机权限来扫描二维码</string>

3. 使用 QrCamera 组件

qr_scanner_flutter 提供了 QrCamera 组件,你可以直接在你的 Flutter 应用中使用它来扫描二维码。

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

class QrScannerScreen extends StatefulWidget {
  [@override](/user/override)
  _QrScannerScreenState createState() => _QrScannerScreenState();
}

class _QrScannerScreenState extends State<QrScannerScreen> {
  String? _qrResult;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('二维码扫描'),
      ),
      body: Column(
        children: [
          Expanded(
            child: QrCamera(
              onScan: (String result) {
                setState(() {
                  _qrResult = result;
                });
              },
              child: Container(
                decoration: BoxDecoration(
                  color: Colors.black.withOpacity(0.5),
                ),
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Text(
              _qrResult ?? '扫描结果将显示在这里',
              style: TextStyle(fontSize: 18),
            ),
          ),
        ],
      ),
    );
  }
}

4. 处理扫描结果

QrCamera 组件的 onScan 回调中,你可以处理扫描到的二维码内容。在这个例子中,我们将扫描结果显示在屏幕上。

5. 启动扫描页面

你可以在应用中通过导航器跳转到 QrScannerScreen 页面:

Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => QrScannerScreen()),
);

6. 自定义扫描界面

QrCamera 组件允许你自定义扫描界面的外观。你可以通过 child 属性来添加自定义的 UI 元素,例如扫描框、提示文字等。

7. 控制相机行为

QrCamera 组件还提供了一些方法来控制相机的行为,例如 stopresume,你可以在需要时调用这些方法来停止或恢复相机的扫描。

QrCameraController? _controller;

[@override](/user/override)
void initState() {
  super.initState();
  _controller = QrCameraController();
}

void _stopCamera() {
  _controller?.stop();
}

void _resumeCamera() {
  _controller?.resume();
}

8. 处理错误

在相机初始化或扫描过程中可能会发生错误,你可以通过 onError 回调来处理这些错误。

QrCamera(
  onScan: (String result) {
    setState(() {
      _qrResult = result;
    });
  },
  onError: (dynamic error) {
    print('Error: $error');
  },
  child: Container(
    decoration: BoxDecoration(
      color: Colors.black.withOpacity(0.5),
    ),
  ),
);

9. 释放资源

在页面销毁时,确保释放相机资源:

[@override](/user/override)
void dispose() {
  _controller?.dispose();
  super.dispose();
}
回到顶部