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

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

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

QR码(扫描码/图片)识别,基于hetian9288/flutter_qr_reader的分叉版本。

我们添加了从QR码读取字节/原始数据的功能,因此onScan()回调函数现在有两个参数:

Future onScan(String data, String rawData) async {
  print(data);
  print(rawData);
}

详细文档可以参见hetian9288/flutter_qr_reader

完整示例代码

import 'dart:io';

import 'package:flutter/material.dart';

import 'package:flutter_qr_scan/flutter_qr_scan.dart';
import 'package:flutter_qr_scan_example/scanViewDemo.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';

void main() => runApp(MyApp());

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(home: HomePage());
  }
}

class HomePage extends StatefulWidget {
  HomePage({Key key}) : super(key: key);

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

class _HomePageState extends State<HomePage> {
  QrReaderViewController _controller;
  bool isOk = false;
  String data;
  String rawData;

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('插件示例应用'),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: <Widget>[
            FlatButton(
              onPressed: () async {
                final status = await Permission.camera.request();
                print(status);
                if (status.isGranted) {
                  showDialog(
                    context: context,
                    builder: (context) {
                      return Dialog(
                        child: Text("ok"),
                      );
                    },
                  );
                  setState(() {
                    isOk = true;
                  });
                }
              },
              child: Text("请求权限"),
              color: Colors.blue,
            ),
            FlatButton(
              onPressed: () async {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) => ScanViewDemo()));
              },
              child: Text("独立UI"),
            ),
            FlatButton(
                onPressed: () async {
                  var image = await ImagePicker().getImage(source: ImageSource.gallery);
                  if (image == null) return;
                  final rest = await FlutterQrReader.imgScan(File(image.path));
                  setState(() {
                    data = rest;
                  });
                },
                child: Text("识别图片")),
            FlatButton(
                onPressed: () {
                  assert(_controller != null);
                  _controller.setFlashlight();
                },
                child: Text("切换闪光灯")),
            FlatButton(
                onPressed: () {
                  assert(_controller != null);
                  _controller.startCamera(onScan);
                },
                child: Text("开始扫码(暂停后)")),
            if (data != null) Text('$data\nrawData: $rawData'),
            if (isOk)
              Container(
                width: 320,
                height: 350,
                child: QrReaderView(
                  width: 320,
                  height: 350,
                  callback: (container) {
                    this._controller = container;
                    _controller.startCamera(onScan);
                  },
                ),
              )
          ],
        ),
      ),
    );
  }

  void onScan(String v, List<Offset> offsets, String raw) {
    print([v, offsets, raw]);
    setState(() {
      data = v;
      rawData = raw;
    });
    _controller.stopCamera();
  }

  [@override](/user/override)
  void dispose() {
    // TODO: 实现dispose方法
    super.dispose();
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_qr_scan插件进行二维码扫描的详细代码示例。这个插件允许你通过设备的摄像头扫描二维码,并获取其内容。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_qr_scan: ^3.0.1  # 请检查最新版本号

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

2. 配置权限

由于二维码扫描需要使用设备的摄像头,你需要在AndroidManifest.xml(针对Android)和Info.plist(针对iOS)中添加相应的权限配置。

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项目中,你可以创建一个新的页面或使用现有页面来启动二维码扫描功能。以下是一个完整的示例:

导入包

在你的Dart文件中导入flutter_qr_scan包:

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

创建扫描页面

创建一个新的页面或修改现有页面,使用QRScanner小部件来启动扫描:

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

class _QRCodeScannerPageState extends State<QRCodeScannerPage> {
  String qrResult = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("二维码扫描"),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Expanded(
            flex: 5,
            child: QRView.builder(
              buildPreview: (BuildContext context) {
                return RCustomPaint(
                  size: Size.square(300.0),
                  painter: QRPainter(data: qrResult),
                );
              },
              onScanResult: (result) {
                setState(() {
                  qrResult = result;
                });
                // 你可以在这里处理扫描结果,例如导航到另一个页面
                // Navigator.pushNamed(context, '/result', arguments: result);
              },
            ),
          ),
          Expanded(
            flex: 1,
            child: Center(
              child: Text(
                "扫描结果: $qrResult",
                style: TextStyle(fontSize: 20),
              ),
            ),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 这里可以添加自定义按钮功能,例如重置扫描结果
          setState(() {
            qrResult = "";
          });
        },
        tooltip: '重置',
        child: Icon(Icons.clear),
      ),
    );
  }
}

注意:RCustomPaintQRPainter是为了在预览中显示扫描结果,这些类需要你自己实现或者你可以直接使用默认的扫描界面。

4. 导航到扫描页面

在你的主页面或者其他页面中,添加导航到二维码扫描页面的功能:

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

这样,你就可以在你的Flutter应用中实现二维码扫描功能了。确保你已经正确配置了权限,并且插件的版本与你的Flutter环境兼容。

回到顶部