flutter-qr_code_scanner、qr_flutter(扫描、生成二维码)

5,384

qr_code_scanner:用的最多的扫码库,也支持开关灯,效果不错推荐,不过其默认在ios端为swift代码,原生默认为Object-c的需要桥接

qr_flutter:一款不错的二维码生成工具,通过传递字符串可以直接生成 Widget

flutter-scankit:华为的扫码库,对于一些小的、有损坏、污点的二维码,有扫描优化,唯一的缺陷就是库太老,除了案例,其他项目基本上用不了直接报错,如果能解决报错还是推荐的,个人比较懒,就不解决了^_^

qr_code_scanner扫码

qr_code_scanner

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';


class ScanPage extends StatefulWidget {
  final Function(Barcode? result)? completed;

  const ScanPage({Key? key, this.completed,}) : super(key: key);

  @override
  State<ScanPage> createState() => _ScanPageState();
}

class _ScanPageState extends State<ScanPage> {
  final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
  QRViewController? _controller;

  @override
  void reassemble() {
    super.reassemble();
    _controller?.resumeCamera();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color.fromRGBO(0, 0, 0, 0.7), //默认颜色,太白了不好看
      body: Stack(
        children: [
          QRView(
            key: qrKey,
            onQRViewCreated: _onQRViewCreated,
          ),
          Positioned(
            bottom: 60,
            left: 0,
            right: 0,
            child: SafeArea(
              child: CupertinoButton(
                onPressed: () {
                  _controller?.toggleFlash();
                },
                child: Container(
                  alignment: Alignment.center,
                  height: 64,
                  child: Image.asset('images/flash_light.png'),
                ),
              ),
            ),
          ),
          SafeArea(
            child: GestureDetector(
              onTap: () {
                Navigator.of(context).pop();
              },
              child: const SizedBox(
                width: 60,
                height: 44,
                child: Icon(
                  Icons.arrow_back_ios_new,
                  color: Colors.white,
                  size: 26,
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }

  void _onQRViewCreated(QRViewController controller) {
    _controller = controller;
    controller.scannedDataStream.listen((result) {
      //print(result.code);
      _controller!.stopCamera();
      Navigator.of(context).pop();
      if (widget.completed != null) {
        widget.completed!(result);
      }
    });
  }

  @override
  void dispose() {
    _controller!.dispose();
    super.dispose();
  }
}

qr_flutter生成二维码

qr_flutter

QrImage(
  data: "1234567890", //数据
  //二维码版本,二维码有很多个版本,不同版本会有所不同,可能会影响一些或者扫描库扫描,碰到问题可以切换版本
  version: QrVersions.auto,
  size: 200.0, //大小
),
QrImage(
  data: 'This QR code will show the error state instead',
  version: 1,
  size: 320,
  gapless: false, //无间隙二维码
  //生成失败后的widget显示
  errorStateBuilder: (cxt, err) {
    return Container(
      child: Center(
        child: Text(
          "Uh oh! Something went wrong...",
          textAlign: TextAlign.center,
        ),
      ),
    );
  },
)