flutter开发实战-flutter二维码条形码扫一扫功能实现

Flutter-实现扫描线移动效果 通过本文的介绍,您学会了如何在Flutter中创建一个扫描线移动效果的控件。通过使用动画控制器和动画构建器,我们可以轻松地实现各种动画效果,为应用程序增添动感和生机。 阅读详情
AI摘要

本文介绍了在Flutter中实现二维码和条形码扫描功能的方法,利用scan插件,涉及iOS和Android的权限设置,以及如何使用ScanView和ScanController进行操作,包括暂停、恢复相机、切换闪光灯等。此外,还展示了如何构建自定义的扫描APPBar。

flutter开发实战-flutter二维码条形码扫一扫功能实现

flutter开发实战-flutter二维码扫一扫功能实现,要使用到摄像头的原生的功能,使用的是插件:scan

效果图如下

在这里插入图片描述

一、扫一扫插件scan

  # 扫一扫
  scan: ^1.6.0

1.1 iOS权限设置

<key>NSCameraUsageDescription</key>
<string>Your Description</string>

<key>io.flutter.embedded_views_preview</key>
<string>YES</string>

1.2 android权限设置

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

<application>
  <meta-data
    android:name="flutterEmbedding"
    android:value="2" />
</application>

1.3 使用ScanView的widget

ScanController controller = ScanController();
String qrcode = 'Unknown';

Container(
  width: 250, // custom wrap size
  height: 250,
  child: ScanView(
    controller: controller,
// custom scan area, if set to 1.0, will scan full area
    scanAreaScale: .7,
    scanLineColor: Colors.green.shade400,
    onCapture: (data) {
      // do something
    },
  ),
),

扫一扫Widget使用ScanController来做响应的控制

暂停/恢复camera

controller.pause();
controller.resume();

识别图片的二维码结果

String result = await Scan.parse(imagePath);

闪光灯切换

controller.toggleTorchMode();

二、代码实现

实现自定义扫码的appBar

class QrScanAppBar extends StatefulWidget {
  const QrScanAppBar({
    Key? key,
    required this.toolbarHeight,
    this.elevation,
    this.backgroundColor,
    this.leadingWidget,
    this.trailingWidget,
    this.centerWidget,
    this.brightness,
    this.padding, this.barPadding,
  }) : super(key: key);

  final double toolbarHeight;
  final double? elevation;
  final Color? backgroundColor;
  final Widget? leadingWidget;
  final Widget? trailingWidget;
  final Widget? centerWidget;
  final Brightness? brightness;
  final EdgeInsetsGeometry? padding;
  final EdgeInsetsGeometry? barPadding;

  
  State<QrScanAppBar> createState() => _QrScanAppBarState();
}

class _QrScanAppBarState extends State<QrScanAppBar> {
  
  Widget build(BuildContext context) {
    final SystemUiOverlayStyle overlayStyle =
        widget.brightness == Brightness.dark
            ? SystemUiOverlayStyle.light
            : SystemUiOverlayStyle.dark;

    Widget leadingWidget = (widget.leadingWidget ?? Container());
    Widget centerWidget = (widget.centerWidget ?? Container());
    Widget trailingWidget = (widget.trailingWidget ?? Container());

    return AnnotatedRegion<SystemUiOverlayStyle>(
      //套AnnotatedRegion是为了增加状态栏控制
      value: overlayStyle,
      child: Material(
        //套Material是为了增加elevation
        elevation: widget.elevation ?? 0,
        color: Colors.transparent,
        child: Container(
          padding: widget.padding,
          height: widget.toolbarHeight + ScreenUtil().statusBarHeight,
          decoration: BoxDecoration(
            color: widget.backgroundColor,
          ),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Container(
                height: ScreenUtil().statusBarHeight,
              ),
              Expanded(
                child: Container(
                  padding: widget.barPadding,
                  height: widget.toolbarHeight,
                  alignment: Alignment.center,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Container(
                        height: widget.toolbarHeight,
                        child: leadingWidget,
                      ),
                      Expanded(
                        child: Container(
                          alignment: Alignment.center,
                          height: widget.toolbarHeight,
                          child: centerWidget,
                        ),
                      ),
                      Container(
                        height: widget.toolbarHeight,
                        child: trailingWidget,
                      ),
                    ],
                  ),
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

实现扫一扫界面

class QrScanPage extends StatefulWidget {
  const QrScanPage({Key? key, this.arguments}) : super(key: key);

  final Object? arguments;

  
  State<QrScanPage> createState() => _QrScanPageState();
}

class _QrScanPageState extends State<QrScanPage> {
  ScanController scanController = ScanController();
  String qrcode = 'Unknown';
  bool torchOn = false;

  
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  
  void dispose() {
    // TODO: implement dispose
    scanController.pause();
    super.dispose();
  }

  void changedTorchMode() {
    scanController.toggleTorchMode();
    if (torchOn == true) {
      torchOn = false;
    } else {
      torchOn = true;
    }
    setState(() {});
  }

  void refreshScan() {
    scanController.resume();
  }

  // controller.resume();
  // controller.pause();
  // String result = await Scan.parse(imagePath);

  
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          buildQrScanView(context),
          Positioned(
            child: buildAppBar(context),
          ),
        ],
      ),
    );
  }

  Widget buildQrScanView(BuildContext context) {
    double width = MediaQuery.of(context).size.width;
    double height = MediaQuery.of(context).size.height;

    double scanW = width * 0.75;
    double scanMY = (height - scanW) / 2.0 + scanW + 15.0;

    return Container(
          alignment: Alignment.center,
          child: Stack(
            alignment: Alignment.center,
            children: [
              ScanView(
                controller: scanController,
                // custom scan area, if set to 1.0, will scan full area
                scanAreaScale: 0.75,
                scanLineColor: Colors.green.shade400,
                onCapture: (data) {
                  // do something
                  LoggerManager().debug("onCapture:${data}");
                  openQrScanWebPage(data);
                },
              ),
              Positioned(
                top: scanMY,
                child: buildOption(context, scanMY),
              ),
            ],
          ),
        );
  }

  Widget buildAppBar(BuildContext context) {
    return QrScanAppBar(
      toolbarHeight: 44.0,
      backgroundColor: Colors.transparent,
      padding: EdgeInsets.symmetric(horizontal: 10.0),
      barPadding: EdgeInsets.symmetric(vertical: 4.0),
      leadingWidget: Container(
        alignment: Alignment.center,
        child: QrscanButton(
          bgColor: ColorUtil.hexColor(0xA9A9A9),
          bgHighlightedColor: ColorUtil.hexColor(0xf0f0f0),
          borderColor: Colors.transparent,
          onPressed: () {
            navigatorBack();
          },
          borderRadius: 18.0,
          height: 36.0,
          width: 36.0,
          child: ImageHelper.wrapAssetAtImages(
            "icons/ic_scan_navback.png",
            width: 36.0,
            height: 36.0,
            fit: BoxFit.fill,
          ),
        ),
      ),
      centerWidget: Text(
        S.of(context).qrScan,
        textAlign: TextAlign.center,
        softWrap: true,
        style: TextStyle(
          fontSize: 17,
          color: ColorUtil.hexColor(0xffffff),
          fontWeight: FontWeight.w600,
          fontStyle: FontStyle.normal,
          decoration: TextDecoration.none,
        ),
      ),
      trailingWidget: Container(
        width: 32.0,
        height: 32.0,
      ),
    );
  }

  Widget buildOption(BuildContext context, double originY) {
    return Container(
      height: ScreenUtil().screenHeight - originY,
      width: ScreenUtil().screenWidth,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Container(
            width: 300.0,
            child: Text(
              S.of(context).qrScanBottomTip,
              textAlign: TextAlign.center,
              softWrap: true,
              style: TextStyle(
                fontSize: 15,
                fontWeight: FontWeight.w500,
                fontStyle: FontStyle.normal,
                color: Colors.white,
                decoration: TextDecoration.none,
              ),
            ),
          ),
          SizedBox(
            height: 25.0,
          ),
          buildButtons(context),
          Expanded(
            child: Container(),
          ),
        ],
      ),
    );
  }

  Widget buildButtons(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Padding(
          padding: EdgeInsets.symmetric(horizontal: 20.0),
          child: QrscanButton(
            bgColor: ColorUtil.hexColor(0x35fb99),
            bgHighlightedColor: Colors.green.shade400,
            onPressed: () {
              changedTorchMode();
            },
            width: 100.0,
            height: 50.0,
            borderRadius: 25.0,
            child: Text(
              (torchOn
                  ? S.of(context).qrScanTorchOff
                  : S.of(context).qrScanTorchOn),
              textAlign: TextAlign.center,
              softWrap: true,
              style: TextStyle(
                fontSize: 14,
                color: ColorUtil.hexColor(0xffffff),
                fontWeight: FontWeight.w600,
                fontStyle: FontStyle.normal,
                decoration: TextDecoration.none,
              ),
            ),
          ),
        ),
        Padding(
          padding: EdgeInsets.symmetric(horizontal: 20.0),
          child: QrscanButton(
            bgColor: ColorUtil.hexColor(0x35fb99),
            bgHighlightedColor: Colors.green.shade400,
            onPressed: () {
              refreshScan();
            },
            width: 100.0,
            height: 50.0,
            borderRadius: 25.0,
            child: Text(
              S.of(context).qrScanRefresh,
              textAlign: TextAlign.center,
              softWrap: true,
              style: TextStyle(
                fontSize: 14,
                color: ColorUtil.hexColor(0xffffff),
                fontWeight: FontWeight.w600,
                fontStyle: FontStyle.normal,
                decoration: TextDecoration.none,
              ),
            ),
          ),
        ),
      ],
    );
  }

  void navigatorBack() {
    NavigatorPageRouter.pop();
  }

  void openQrScanWebPage(String data) {
    Map<String, dynamic> args = {};
    args["url"] = data;

    /// true保留跳转的当前栈   false 不保留
    NavigatorPageRouter.pushReplacementNamed(
      RouterName.web,
      arguments: args,
    );
  }
}

三、小结

flutter开发实战-flutter二维码扫一扫功能实现,要使用到摄像头的原生的功能,使用的是插件:scan,实现自定义Appbar。

学习记录,每天不停进步。

Flutter仿微信扫一扫(扫码,图片翻译) 仓库地址: GitHub - autumn-moon-py/wechat_scan扫描单个二维码开关手电筒相册选择双击放大缩小双指捏合放大缩小二维码生成二维码保存图片图片翻译相册选择get: ^4.6.5 路由管理,简化弹窗,底部抽屉,验证URLurl_launcher: ^6.1.8 打开浏览器访问网站wechat_assets_picker: ^8.5.0 微信资源选择器qrscan: ^0.3.3 扫描相册二维码mobile_scanner: ^3.2.0 扫描相机二维码vibration: ^1.7 阅读详情

相关推荐

【Flutter】Flutter 使用 qr_flutter 实现QR码二维码生成与渲染

`qr_flutter` 是一个专为 Flutter 设计的库,它可以简单快速地通过小部件或自定义绘制器渲染 QR 代码。这个库的核心是基于 QR - Dart,所以它非常稳定和高效。它支持 QR 代码版本 1 - 40,具有错误纠正/冗余功能,并且可以配置输出大小、填充、背景和前景颜色。

Code Metaverse 1775

Flutter 3.X二维码扫描功能

【代码】Flutter 3.X二维码扫描功能。

佛陀爱老虎的博客 1777

数字麦克风PDM信号采集与STM32 I2S接口应用(二)

在使用STM32的数字麦克风I2S接口时,计算采样率让人头疼,芯片手册上没有明确的说法,而手册上的计算方法经过测试却和实验不符。借助搜索引擎,大部分资料都是来自于开发板卖家或开发板论坛,主要是咪头采集然后配置WM89系列解码芯片,然后配合FatFS、MP3解码等模式,主要是讲解I2S录音、存储、放音等。外文资料得到的也寥寥无几,也没有找到讲解STM32数字麦克风配置、计算的文档。加上网上资料转载、抄袭、浅尝辄止的笔记教程,这些更是让检索大海捞针,过程艰辛一言难尽,有些网文三言两语抑或作者都没有搞清楚随手一写

XIAOYOUDUODUO的博客 6054

Flutter 扫描二维码

本文展示了如何在 Flutter 中实现二维码扫描和从相册选择二维码图片的功能。通过使用scan和插件,我们可以轻松地添加二维码扫描和图片识别功能。在开发实际应用时,可能还需要处理更多细节,例如处理不同平台的权限请求、优化扫描体验等。希望这篇文章能帮助你更好地理解如何在 Flutter 中实现二维码扫描功能,并能够应用到你的项目中。

qq_52871405的博客 4561

Ansys HFSS 中的同轴电缆仿真

准确模拟它们的行为对于确保 RF 系统的最佳性能至关重要。在本博客中,我们将介绍在 HFSS 中设置同轴电缆仿真并绘制插入损耗、回波损耗和电场分布的过程。将波端口分配给同轴线的两端以激励模型,并定义了从 1 GHz 到 20 GHz 的频率扫描以评估其宽带性能。铜分配给内部导体,铝分配给外部导体。介电区域使用 PTFE 定义,其相对介电常数为 2.1,损耗角正切为 0.00022。仿真完成后,结果用于绘制整个频率范围内的回波损耗和插入损耗。此外,电介质内的电场分布也被绘制和动画化。

jkh920184196的博客 1907

C# 开发 ACS 运动控制系统:从入门到高阶应用实践

起始位置</param>/// <param name="endPos">结束位置</param>/// <param name="maxVelocity">最大速度</param>/// <param name="maxAcceleration">最大加速度</param>/// <param name="maxJerk">最大加加速度

品质生活,极致编程。 2842

Flutter实战开发(1)------实现条形码和二维码扫描

实现条形码和二维码扫描前言准备工具引入插件具体实现 前言 前几天突发奇想就想做一个扫描二维码和条形码的demo,查阅了一些资料,发现有qrscan这个插件可以实现,就自己写了一个例子,供大家学习. 准备工具 这套课程是采用Android Studio进行开发的。当前在此之前请准备好Flutter开发环境,我这里就不进行讲解了。 引入插件 到pubspce.yaml中导包 depende...

追逐蓦然 1万+

Brainstorm简单分析近红外数据(fNIRS)(一)

Brainstorm分析fNIRS数据

weixin_43604817的博客 1351

Flutter扫码功能完美实现

如何快速完美地实现Flutter扫码 效果预览 笔者非常执着于能使用直观的效果展示,但是因为优快云的大小限制,笔者做了很强的压缩,大致还是能看出代码的最终结果 实现需求 实现需求 是否实现 自定义扫码区域大小 ✅ 连续扫码 ✅ 从相册选择 ✅ 支持二维码 ✅ 支持条形码 ✅ 扫描动画特效 ✅ 环境 Flutter版本 1.22.0.stable pubspec.yaml中添加依赖 scan: 0.0.7 images_picker: 0.0.8 其中sca

qq_39694327的博客 9846

魔兽世界怀旧服宏命令全解析:从自动换装到智能判定,老玩家才知道的黑科技

本文全面解析魔兽世界怀旧服宏命令的高级应用,从自动换装到智能判定,揭秘老玩家专属的黑科技技巧。深入探讨怀旧服特有的宏命令机制,包括施法队列、装备切换系统和职业专属技巧,帮助玩家在经典旧世版本中提升战斗效率。

weixin_29230865的博客 727

鸿蒙应用发布实战:应用热更新的实现

在移动应用开发领域,应用更新是持续交付价值的关键环节。传统的应用更新方式需要用户手动下载完整安装包,不仅用户体验差,而且更新率往往不理想。热更新技术(也称为OTA更新)允许应用在不重新安装的情况下动态更新部分功能,极大提升了用户体验和迭代效率。本文专注于鸿蒙操作系统下的应用热更新实现方案,涵盖从原理到实践的完整知识体系。鸿蒙热更新的技术架构差分更新算法实现动态部署机制实际项目中的最佳实践安全与性能优化策略首先介绍鸿蒙热更新的背景和核心概念深入分析技术原理和算法实现。

操作系统内核探秘的博客 965

Flutter for OpenHarmony 实战:Barcode — 纯 Dart 条形码与二维码生成全指南

本文介绍了在Flutter for OpenHarmony开发中使用纯Dart实现的barcode_widget库生成条形码和二维码的完整指南。文章首先分析了该库的核心优势:采用SVG矢量化渲染,保证了跨平台一致性和高清屏幕下的显示效果。随后详细讲解了环境配置方法,并提供了三种典型应用场景的代码示例:社交链接分享(QR Code)、物流单号(Code 128)和商品零售(EAN 13)。针对OpenHarmony平台的特殊性,文章给出了屏幕对比度优化和折叠屏适配建议。最后通过一个完整的支付看板实战案例,展示

jiang_style的博客 1万+

汽车UDS诊断详解及Vector相关工具链使用说明——1.1 应用层协议整体介绍

本文我们先从整体的维度来介绍一下应用层协议,每个UDS服务都遵循本文中的协议。 一、SI(Service ID) SI是UDS指令的第一个字节,我们第一篇文章中提到的10等服务就是指这个服务的SI=0x10,它是服务的标识,每个服务的SI都是唯一的。 ...

weixin_42967006的博客 5474

Flutter 应用实现条形码、二维码的扫描与生成

一、前言 我们开发原生的时候可以使用zxing进行生成条形码与二维码,但是flutter的插件中只找到了二维码的生成与扫描,业务需求里面需要条形码的生成,需要在原有的基础上进行修改。 二、效果图 三、扫码逻辑 通过MethodChannel调用原生代码,进行效果的实现 const MethodChannel _channel = const MethodChannel(‘qr_scan’) 四、具体实现方案 1.使用的第三方库 qrscan: ^0.2.17 2.主要代码 class MyA

Locog 3159

【自动驾驶轨迹规划之hybrid A*算法】

本文参考论文:https://ai.stanford.edu/~ddolgov/papers/dolgov_gpp_stair08.pdf 这篇文章是基于经典A*算法与reeds-shepp曲线的,不清楚的读者请参考【自动驾驶轨迹规划5之A*算法】_无意2121的博客-优快云博客【自动驾驶轨迹规划之dubins曲线与reeds-shepp曲线】_无意2121的博客-优快云博客 目录 1 hybrid A* 算法创新点 1.1 搜索方式 1.2 车辆运动学模型 1.3 reeds-shepp曲

weixin_65089713的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

从0开始搭建Flutter条形码二维码扫描插件及应用

Google今年推出了Flutter 2。一套Dart代码可以覆盖桌面,web和移动开发,大大降低跨平台应用开发成本。然而平台相关的逻辑还是需要用相应的本地代码去实现。这篇文章分享如何从0开始,搭建发布Flutter的条形码二维码扫描插件,以及如何使用该插件来实现一个Android的扫码应用。 Flutter安装 参考Flutter中国区安装指南:https://flutter.dev/community/china Linux, mac配置环境变量: export PUB_HOSTED_URL=http

yushulx的专栏 1154

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Flutter扫码识别二维码内容

前面一篇写了生成二维码图片,这篇来写使用相机扫描识别二维码 识别二维码需要用到插件barcode_scan 首先在pubspec.yaml文件中添加以下依赖,添加依赖后在pubspec.yaml运行flutter packages get或 使用IDE更新软件包。 dependencies: ... barcode_scan: ^1.0.0 ...

weixin_30323631的博客 2246

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Flutter】二维码条形码扫一扫功能实现

class QrScanPage extends StatefulWidget {const QrScanPage({Key? key, this.arguments}) : super(key: key);final Object? arguments;@overrideState createState() => _QrScanPageState(); }class _QrScanPageState extends State

资深全栈开发工程师 1073

Flutter 最佳扫码插件

长期以来,Flutter都缺乏一个简单易用,功能强大的二维码、条形码等扫码库,需要既能支持相机扫码,也能支持本地图片码识别。为了解决这个问题,我考察了原生的扫码生态,选取了功能强大的HUAWEI ScanKit SDK,对它进行了Flutter插件包封装。 ...

编程之路的专栏 4740

Flutter for OpenHarmony: Flutter 三方库 barcode_image 为鸿蒙应用提供全场景条形码与二维码绘制生成方案(识别码专家)

摘要:本文介绍了barcode_image软件包在OpenHarmony开发中的应用,该工具能将数据转换为条码/二维码图像。文章详细讲解了其核心API使用方法,包括生成Image对象和保存为本地文件,并展示了智慧零售、工控设备标识等典型应用场景。特别针对鸿蒙平台提供了屏幕亮度优化和大规模生成建议,最后通过资产标签生成器的完整示例演示了实际应用。该工具为OpenHarmony开发者提供了高效精准的视觉编码解决方案。

jiang_style的博客 5482

Flutter实战开发(2)------实现条形码扫描获取商品信息

实现条形码和二维码扫描前言准备工具配置后端接口编写调用接口方法页面布局 前言 上一篇博客就大致讲了一下qrscan这个插件的使用,没有具体的实现,这篇博客就来个实战吧,来做一个反盗版商品的例子 准备工具 这套课程是采用Android Studio进行开发的。当前在此之前请准备好Flutter开发环境,我这里就不进行讲解了,基础知识请到条形码和二维码扫描这篇博客学习 配置后端接口 本次项目...

追逐蓦然 7370

flutter实现条形码二维码扫描

flutter实现条形码二维码扫描准备工作使用 我们使用到的第三方插件为barcode_scan2 地址为:https://pub.flutter-io.cn/packages/barcode_scan2 准备工作 安卓使用此插件需要注意以下几点: 相机权限添加 将相机权限添加到您的 AndroidManifest 中.xml <uses-permission android:name="android.permission.CAMERA" /> 这个插件是用 Kotlin 编写的。因此

m0_46527751的博客 2968

Flutter扫码插件mobile_scanner:5分钟实现跨平台二维码扫描完整指南

想要在Flutter应用中快速集成二维码扫描功能?mobile_scanner插件是你的终极解决方案!这款基于MLKit的跨平台扫码工具,支持Android、iOS、macOS和Web平台,让你在5分钟内就能实现专业的二维码扫描功能。🚀 ## 为什么选择mobile_scanner? mobile_scanner是一个功能强大的Flutter扫码插件,它提供了: - **跨平台支持**:A

gitblog_00171的博客 683

Flutter进阶第11篇: 调用原生硬件Api实现扫码 扫描条形码 扫描二维码

效果图: 第一步: 导入第三方库:barcode_scan 第二步: <uses-permission android:name="android.permission.CAMERA" /> 第三步: 3.1 的 编 辑 你 的 d android 的 目 录 下 面 的 e build.gradle ( Edit your project-level build.gradle...

qq_27494201的博客 3022

Flutter for OpenHarmony:zxing2 纯 Dart 条码扫描与生成库(不仅是扫码,更是编解码引擎) 深度解析与鸿蒙适配指南

本文介绍了如何在OpenHarmony平台使用纯Dart实现的zxing2库进行二维码处理。该库不依赖原生插件,支持二维码生成和解析功能,但性能有限。文章详细讲解了核心原理、OpenHarmony适配要点(如必须使用Isolate处理)、基础用例代码,并提供了一个完整的相册图片识别实战示例。虽然zxing2在实时扫码场景性能不足,但在二维码生成和静态图片解析方面仍是可靠选择,特别适合OpenHarmony早期生态中的轻量级应用场景。

alex_goden的博客 7365

qr.dart: Flutter 的二维码和条形码库

qr.dart: Flutter 的二维码和条形码库 是一个用于生成 QR 和条形码的 Flutter 库,由 Kevmoo 开发并维护。它提供了简单易用的 API,使您能够轻松地在 Flutter 应用程序中集成二维码和条形码功能。 使用场景 qr.dart 可以广泛应用于各种场景,例如: 创建可扫描的二维码或条形码来分享信息。 在电子商务应用程序中显示产品条形码。 将数据编码到二维码或条形码...

gitblog_00072的博客 699
上一篇: flutter开发实战-webview自定义标题栏Appbar
下一篇: flutter开发实战-flutter实现类似iOS的Alert提示框与sheet菜单效果
BruceGwo
博客等级 码龄16年 549粉丝 278原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值