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

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

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

插件简介

QR Mobile Vision 是一个用于读取二维码和其他条形码的Flutter插件,它依赖于Firebase的MLKit。此插件利用Android和iOS的原生API从设备摄像头获取图像,并将这些图像传递给MLKit Vision Barcode API以检测条形码/二维码等,同时输出预览图像显示在Flutter纹理上。该插件包含一个执行所有必要转换的Widget,以确保相机输出正确显示在定义区域内。

Android模型选择

  • 使用内置模型:增加约2.2MB代码量,但扫描效果更好且无需后台下载额外包。
  • 使用Google Play Services动态下载模型:需要确保应用安装时自动下载模型。

iOS要求

对于较新的Google条形码扫描库版本(如’GoogleMLKit/BarcodeScanning’),需要iOS 15.5+版本。如果遇到依赖错误,请确保项目使用的是15.5或更高版本。

使用方法

基本用法

首先确定你想要展示相机预览的区域大小,因为这一步非常重要——预览必须有一个受限尺寸才能正常构建。推荐的方式是将其放在SizedBox或Container中。

接下来,你需要引入这个包并实例化相机组件:

import 'package:qr_mobile_vision/qr_camera.dart';

...

new SizedBox(
  width: 300.0,
  height: 600.0,
  child: new QrCamera(
    qrCodeCallback: (code) {
      // 处理扫描到的二维码数据
    },
  ),
)

可选参数说明

  • fit: 设置预览图片适应方式,默认已测试过BoxFit.cover
  • notStartedBuilder: 定义相机加载时显示的内容。
  • child: 在QrCamera之上叠加显示的Widget。
  • key: 标准Flutter key参数。
  • cameraDirection: 指定使用的摄像头方向,默认为后置摄像头。
  • offscreenBuilder: 当相机视图不在屏幕时显示的内容。
  • onError: 错误回调函数。
  • formats: 支持的格式列表,默认支持所有格式。
  • direction: 摄像头方向(前后)。

切换闪光灯

当相机正在运行时,可以通过调用QrCamera.toggleFlash()QrMobileVision.toggleFlash()方法来开关闪光灯。

示例代码

下面是一个完整的示例demo,展示了如何集成和使用qr_mobile_vision插件进行二维码扫描:

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:qr_mobile_vision/qr_camera.dart';

void main() {
  debugPaintSizeEnabled = false;
  runApp(const HomePage());
}

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

  @override
  HomeState createState() => HomeState();
}

class HomeState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(home: MyApp());
  }
}

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

  @override
  MyAppState createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  String? qr;
  bool camState = false;
  bool dirState = false;

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
        actions: <Widget>[
          IconButton(icon: const Icon(Icons.light), onPressed: _swapBackLightState),
        ],
      ),
      body: Center(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text("Back"),
                Switch(value: dirState, onChanged: (val) => setState(() => dirState = val)),
                const Text("Front"),
              ],
            ),
            Expanded(
                child: camState
                    ? Center(
                        child: SizedBox(
                          width: 300.0,
                          height: 600.0,
                          child: QrCamera(
                            onError: (context, error) => Text(
                              error.toString(),
                              style: const TextStyle(color: Colors.red),
                            ),
                            cameraDirection: dirState ? CameraDirection.FRONT : CameraDirection.BACK,
                            qrCodeCallback: (code) {
                              setState(() {
                                qr = code;
                              });
                            },
                            child: Container(
                              decoration: BoxDecoration(
                                color: Colors.transparent,
                                border: Border.all(
                                  color: Colors.orange,
                                  width: 10.0,
                                  style: BorderStyle.solid,
                                ),
                              ),
                            ),
                          ),
                        ),
                      )
                    : const Center(child: Text("Camera inactive"))),
            Text("QRCODE: $qr"),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
          child: const Text(
            "on/off",
            textAlign: TextAlign.center,
          ),
          onPressed: () {
            setState(() {
              camState = !camState;
            });
          }),
    );
  }

  _swapBackLightState() async {
    QrCamera.toggleFlash();
  }
}

通过上述内容,你应该能够理解并开始使用qr_mobile_vision插件来进行二维码扫描了。如果有任何问题或者需要进一步的帮助,请随时提问!


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

1 回复

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


当然,下面是一个关于如何使用 qr_mobile_vision 插件在 Flutter 应用中实现二维码扫描的示例代码。请注意,qr_mobile_vision 插件依赖于 Google 的 ML Kit,因此确保你的应用环境支持这些依赖项。

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

dependencies:
  flutter:
    sdk: flutter
  qr_mobile_vision: ^0.5.0  # 请注意检查最新版本号

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

接下来,我们编写一个 Flutter 应用来实现二维码扫描功能。

1. 创建主页面

创建一个新的 Dart 文件,比如 main.dart,并编写以下代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter QR Code Scanner',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ScannerPage(),
    );
  }
}

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

class _ScannerPageState extends State<ScannerPage> {
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
  QrResult? _qrResult;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        title: Text('QR Code Scanner'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Expanded(
            flex: 5,
            child: QrCamera(
              onQrCodeScanned: _handleQrCodeScanned,
            ),
          ),
          Expanded(
            flex: 1,
            child: _qrResult != null
                ? Container(
                    alignment: Alignment.center,
                    child: Text(
                      'Scanned: $_qrResult!',
                      style: TextStyle(fontSize: 24),
                    ),
                  )
                : Container(),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          // Open the camera in paused state (not scanning)
          final QrCameraController controller = QrCameraController();
          await controller.initialize();
          if (!mounted) return;
          controller.pauseCamera();
          // Here you can show a preview of the camera frame without scanning
          // For simplicity, we'll just close it after 2 seconds
          Future.delayed(Duration(seconds: 2), () {
            controller.dispose();
            Navigator.pop(context); // Back to the scanning state
          });
        },
        tooltip: 'Pause Camera',
        child: Icon(Icons.pause),
      ),
    );
  }

  void _handleQrCodeScanned(QrResult result) {
    setState(() {
      _qrResult = result;
      // Optionally navigate to another screen or process the result
      // Navigator.pushNamed(context, '/result', arguments: result);
    });
  }
}

2. 权限处理

在 Android 上,你需要在 AndroidManifest.xml 中请求相机权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.qrcodescanner">

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

    <application
        ... >
        ...
    </application>
</manifest>

此外,由于 qr_mobile_vision 依赖于 Google ML Kit,你可能还需要在 build.gradle 文件中添加一些配置,具体取决于你的项目设置和插件版本。

3. iOS 权限处理

在 iOS 上,你需要在 Info.plist 中添加相机使用描述:

<key>NSCameraUsageDescription</key>
<string>This app needs access to the camera to scan QR codes.</string>

4. 运行应用

确保所有依赖和配置正确后,你可以通过运行 flutter run 来启动你的应用。如果一切设置正确,你应该能够看到一个相机界面,当扫描到二维码时,会在界面上显示扫描结果。

请注意,qr_mobile_vision 插件可能会随着 Flutter 和 ML Kit 的更新而发生变化,因此建议查阅最新的插件文档以获取最新的使用指南和配置要求。

回到顶部