Flutter二维码扫描 2023-01-28 周六

2023-01-28  本文已影响0人  松哥888

简介

当前二维码扫描功能越来越普遍。在iOS原生,可以使用AVFoundation种的AVCapture相关的API进行自定义。
在Flutter层面,稍微想想就知道,Dart直接支持有点远,应该是需要通过插件的方式来实现。

插件选择

企业微信截图_94a7e1ab-2911-4470-bef5-c3895d1328f8.png

可以3个都看看,当然,也可以按照指标,直接选最多的那个qr_code_scanner
如果不在意指标,很有可能会选第3个mobile_scanner。虽然没有提供例子图片,但是其介绍中提到其实现方式都是系统原生的;不像第1个,原生实现都是采用了不再更新的第三方库。

flutter pub add qr_code_scanner

样例讨论

官网的Readme部分给出了一个例子,照抄可以用。这里给出一些不一样的思考。

热重载

  // In order to get hot reload to work we need to pause the camera if the platform
  // is android, or resume the camera if the platform is iOS.
  @override
  void reassemble() {
    super.reassemble();
    if (Platform.isAndroid) {
      controller!.pauseCamera();
    } else if (Platform.isIOS) {
      controller!.resumeCamera();
    }
  }

扫描视图

扫描结果

void _onQRViewCreated(QRViewController controller) {
    controller.scannedDataStream.listen((scanData) {
      setState(() {
        result = scanData;
      });
    });
  }

资源回收

QRViewController由QRView创建,通过onQRViewCreated暴露出来,但是dispose方法需要使用者来调用。

权限管理

扫描结果去重

    controller.scannedDataStream.listen((scanData) {
      setState(() {
        result = scanData;
      });
    });

参考代码

  /// 页面结构
  Widget _buildBody() {
    return QRView(
      key: GlobalKey(debugLabel: 'QR'),
      overlay: QrScannerOverlayShape(),
      onQRViewCreated: (qrViewController) {
        qrViewController.scannedDataStream.listen((barcode) {
          String code = barcode.code ?? '';
          if (code.isNotEmpty) {
            qrViewController.pauseCamera();
            EasyLoading.showInfo(code, duration: const Duration(seconds: 5));
            qrViewController.dispose();
            Get.back(result: code);
          }
        });
      },
      onPermissionSet: (qrViewController, isPermission) {
        if (!isPermission) {
          EasyLoading.showInfo('no permission');
          qrViewController.dispose();
          Get.back();
        }
      },
    );
  }

其他功能

相机相关的功能都包含在QRViewController中,比如火炬灯光,切换前后摄像头等。

上一篇 下一篇

猜你喜欢

热点阅读