当前位置: 首页 > news >正文

flutter生成二维码并截图保存到图库

在这里插入图片描述在这里插入图片描述

引入库:flutter_screenutil、image_gallery_saver、qr_flutter弹窗布局

import 'dart:async';
import 'dart:typed_data';
import 'package/generated/l10n.dart';
import 'package:jade/configs/PathConfig.dart';
import 'package:jade/utils/ImageWaterMarkUtil.dart';
import 'package:jade/utils/JadeColors.dart';
import 'package:jade/utils/Utils.dart';
import 'package:util/easy_loading_util.dart';
import 'package:util/navigator_util.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:qr_flutter/qr_flutter.dart';import 'dart:ui' as ui;
/*
* 普通说明弹窗(可隐藏取消按钮)
* */
Widget productQrcodeDialog (BuildContext context,{ String descTitle,String subTitle,String desc,String qrStr,GlobalKey globalKey,Function callback,Function cancelCallback,bool showCancel = false,String sureBtnText,Color sureBtnTextColor}){return UnconstrainedBox(child: Container(alignment: Alignment.center,width: Utils().screenWidth(context)*0.8,decoration: BoxDecoration(color: Colors.white,borderRadius: BorderRadius.circular(20),),child: Column(mainAxisSize: MainAxisSize.min,children: [if(descTitle != null)Container(margin: EdgeInsets.only(top: 50.w),child: Text(descTitle??'',style: TextStyle(color: JadeColors.grey_2,fontSize: 38.sp,fontWeight: FontWeight.w600))),if(subTitle != null)Container(margin: EdgeInsets.only(top: 20.w),child: Text(subTitle,style: TextStyle(color: JadeColors.grey,fontSize: 24.sp))),if(desc != null)Container(margin: EdgeInsets.only(top: 30.w,bottom: 30.w),padding: EdgeInsets.symmetric(horizontal: 30.w),child: Text(desc,style: TextStyle(color: JadeColors.grey_2,fontSize: 30.sp),maxLines: 300,textAlign: TextAlign.center,)),RepaintBoundary(key: globalKey,child: Container(width: Utils().screenWidth(context)*0.6,height: Utils().screenWidth(context)*0.6,decoration: BoxDecoration(color: Colors.white,borderRadius: BorderRadius.circular(10),border: Border.all(width: 1,color: JadeColors.blue_2)),child: Stack(alignment: Alignment.center,children: [QrImage(padding: EdgeInsets.all(11.w),data: qrStr,version: QrVersions.auto,size: Utils().screenWidth(context) * 0.6,),Container(width: 60.w,height: 60.w,decoration: BoxDecoration(color: Colors.white,borderRadius: BorderRadius.circular(5),border: Border.all(width: 1.w,color:Colors.white)),child: Utils().roundedImage(PathConfig.httpAppLogo, 5),)],)),),Container(margin: EdgeInsets.only(top: 40.w),height: 0.5,color: JadeColors.grey_13,),Container(height: 92.w,child: Row(children: [if(showCancel)Expanded(child: GestureDetector(child: Container(color: Colors.transparent,alignment: Alignment.center,child: Text(S.current.quxiao,style: TextStyle(color: JadeColors.grey,fontSize: 34.sp,fontWeight: FontWeight.w300))),onTap: (){NavigatorUtil.pop();if(cancelCallback != null){cancelCallback();}},)),if(showCancel)Container(width: 0.5,color: JadeColors.grey_13,height: double.infinity,),Expanded(child: GestureDetector(child: Container(alignment: Alignment.center,color: Colors.transparent,child: Text(sureBtnText??S.current.close,style: TextStyle(color: sureBtnTextColor??Colors.blue,fontSize: 34.sp,fontWeight: FontWeight.w600),textAlign: TextAlign.center),),onTap: () async {_saveScreenshot(globalKey);if(callback != null){callback();}},)),],),)],),));
}Future<Uint8List> takeScreenshot(GlobalKey _globalKey) async {try {RenderRepaintBoundary boundary = _globalKey.currentContext.findRenderObject() as RenderRepaintBoundary;ui.Image image = await boundary.toImage(pixelRatio: 3.0); // 调整分辨率以适应高像素密度设备ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.png);if (byteData != null) {Uint8List pngBytes = byteData.buffer.asUint8List();return pngBytes;}} catch (e) {print(e);}return null;
}_saveScreenshot(GlobalKey globalKey) async {Uint8List screenshotBytes = await takeScreenshot(globalKey);if (screenshotBytes != null) {final result = await ImageGallerySaver.saveImage(screenshotBytes);print('result= $result');// 打印保存结果esLoadingToast('已保存截图至本地');}else{esLoadingToast('截图保存失败');}NavigatorUtil.pop();
}

弹窗

 /** 产品二维码弹窗* */Future<void> productQrCodeDialog(BuildContext context,{String descTitle,String subTitle,String desc,String qrStr,GlobalKey globalKey,Function callback,Function cancelCallback,bool showCancel = false,String sureBtnText,Color sureBtnTextColor}) async {showDialog(context: context,barrierDismissible: false,builder: (BuildContext context) {return productQrcodeDialog(context,descTitle: descTitle,subTitle: subTitle,desc: desc,qrStr: qrStr,globalKey: globalKey,showCancel: showCancel,sureBtnText: sureBtnText,sureBtnTextColor:sureBtnTextColor,callback: callback,cancelCallback : cancelCallback);});}

调用

GlobalKey _globalKey = new GlobalKey();
GestureDetector(
child:_btnView(),
onTap: (){
productQrCodeDialog(context,descTitle: '产品二维码',desc: '请保存下载该二维码并打印,随同产品一起寄送至站点。',qrStr: '二维码的内容',globalKey: _globalKey,showCancel: true,sureBtnText: '下载',sureBtnTextColor: JadeColors.grey_2,callback: (){});}
}
)

相关文章:

flutter生成二维码并截图保存到图库

引入库&#xff1a;flutter_screenutil、image_gallery_saver、qr_flutter弹窗布局 import dart:async; import dart:typed_data; import package/generated/l10n.dart; import package:jade/configs/PathConfig.dart; import package:jade/utils/ImageWaterMarkUtil.dart; im…...

EasyExcel Converter实现java对象和excel单元格转换

在EasyExcel中&#xff0c;Converter接口用于定义如何在Java对象和Excel单元格之间进行转换。 也就是说EasyExcel可以根据数据库中的值来填充Excel中对应的文本内容。 比如数据库1,2,3可以填充到excel中&#xff1a;男&#xff0c;女&#xff0c;其他 使用easyExcel的之前&a…...

stamac Ethernet DTS配置

目录 Demo 配置 compatible reg interrupts & interrupt-names phy-mode phy-handle Snps,reset-gpio...

Svg Flow Editor 原生svg流程图编辑器(四)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;四&#xf…...

Verilog语法之assign语句学习

assign语法主要是对组合逻辑的变量进行赋值的&#xff0c;就是把一个变量赋值给另一个变量&#xff0c;被复制的变量必须是wire类型的参数。 从仿真结果可以看出&#xff0c;data_in变量的值赋值给了data_out,assign语法就是赋值没有任何延迟&#xff0c;data_in是什么值&#…...

Cocos2dx-lua ScrollView[三]高级篇

一.概述 本文缩写说明&#xff1a;sv ScrollView, cell代表ScrollView的一个子节点 本文介绍sv的一种封装类库&#xff0c;来实现快速创建sv&#xff0c;有如下几个优点&#xff1a; 1.item的位置通过参数控制&#xff0c;提高开发效率 2.免去了调用sv的API&#xff0c;提…...

后端之卡尔曼滤波

后端之卡尔曼滤波 前言 在很久之前&#xff0c;人们刚结束信息传递只能靠信件的时代&#xff0c;通信技术蓬勃发展&#xff0c;无线通信和有线通信走进家家户户&#xff0c;而著名的贝尔实验室就在这个过程做了很多影响深远的研究。为了满足不同电路和系统对信号的需求&#…...

Docker 夺命连环 15 问

目录 什么是Docker&#xff1f; Docker的应用场景有哪些&#xff1f; Docker的优点有哪些&#xff1f; Docker与虚拟机的区别是什么&#xff1f; Docker的三大核心是什么&#xff1f; 如何快速安装Docker&#xff1f; 如何修改Docker的存储位置&#xff1f; Docker镜像常…...

2024最新版克魔助手抓包教程(9) - 克魔助手 IOS 数据抓包

引言 在移动应用程序的开发中&#xff0c;了解应用程序的网络通信是至关重要的。数据抓包是一种很好的方法&#xff0c;可以让我们分析应用程序的网络请求和响应&#xff0c;了解应用程序的网络操作情况。克魔助手是一款非常强大的抓包工具&#xff0c;可以帮助我们在 Android …...

Spring Boot 防止XSS攻击

XSS 跨站脚本工具&#xff08;cross 斯特scripting&#xff09;&#xff0c;为不和层叠样式表&#xff08;cascading style sheets,CSS&#xff09;的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS。恶意攻击者往web页面里插入恶意ScriptScript代码&#xff0c;当用户浏览该页…...

aidl文件生成Java、C++[android]、C++[ndk]、Rust接口

目录 前言一、Java二、C[android]三、C[ndk]四、Rust接口 前言 在 Android 开发中&#xff0c;AIDL 文件通常会被自动编译&#xff0c;生成对应语言的接口文件。对于应用层 Java 开发者来说&#xff0c;使用 AIDL 和 Binder 封装的接口可以让他们更加专注于应用逻辑&#xff0…...

多源统一视频融合可视指挥调度平台VMS/smarteye系统概述

系统功能 1. 集成了视频监控典型的常用功能&#xff0c;包括录像&#xff08;本地录像、云端录像&#xff08;录像计划、下载计划-无线导出&#xff09;、远程检索回放&#xff09;、实时预览&#xff08;PTZ云台操控、轮播、多屏操控等&#xff09;、地图-轨迹回放、语音对讲…...

PyTorch简介:与TensorFlow的比较

PyTorch简介&#xff1a;与TensorFlow的比较 一、PyTorch框架概述 PyTorch是一个开源的机器学习库&#xff0c;广泛用于计算机视觉和自然语言处理。由Facebook的人工智能研究团队开发&#xff0c;它以其灵活性和动态计算图而闻名。 主要特点 动态计算图&#xff1a;PyTorch…...

虚拟机-从头配置Ubuntu18.04(包括anaconda,cuda,cudnn,pycharm,ros,vscode)

最好先安装anaconda后cuda和cudnn&#xff0c;因为配置环境的时候可能conda会覆盖cuda的路径&#xff08;不确定这种说法对不对&#xff0c;这里只是给大家的建议&#xff09; 准备工作&#xff1a; 1.Ubuntu18.04&#xff0c;x86_64&#xff0c;amd64 虚拟机下载和虚拟机Ubu…...

uniApp使用XR-Frame创建3D场景(8)粒子系统

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 本片我们详细讲解一下xr-frame的粒子系统 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{{sec8}}"><xr-asset-load t…...

【JMeter入门】—— JMeter介绍

1、什么是JMeter Apache JMeter是Apache组织开发的基于Java的压力测试工具&#xff0c;用于对软件做压力测试。它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 &#xff08;Apache JMeter是100%纯JAVA桌面应用程序&#xff09;Apache JMeter可以用于对静…...

C# 多线程编程:线程锁与无锁并发

文章目录 前言一、锁的基本概念1.1 什么是锁&#xff1f;1.2 为什么需要锁&#xff1f;1.3 锁的作用原理 二、线程锁的类型2.1 自旋锁&#xff08;Spin Lock&#xff09;2.2 互斥锁&#xff08;Mutex&#xff09;2.3 混合锁&#xff08;Hybrid Lock&#xff09;2.4 读写锁&…...

React.FC

React.FC 是 React 中的一个类型别名&#xff0c;代表“函数组件”。它是一个接受 props&#xff08;属性&#xff09;并返回 JSX 元素的函数。 type React.FC<P {}> (props: P) > ReactElement | null;其中&#xff1a;P 是一个可选的泛型类型参数&#xff0c;表示…...

使用pytorch构建一个无监督的深度卷积GAN网络模型

本文为此系列的第二篇DCGAN&#xff0c;上一篇为初级的GAN。普通GAN有训练不稳定、容易陷入局部最优等问题&#xff0c;DCGAN相对于普通GAN的优点是能够生成更加逼真、清晰的图像。 因为DCGAN是在GAN的基础上的改造&#xff0c;所以本篇只针对GAN的改造点进行讲解&#xff0c;其…...

[AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯

AI文心一言出圈的同时&#xff0c;NLP处理下的ChatGPT-4.5最新资讯 1.背景介绍 随着人工智能技术的不断发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术在近年来取得了显著的进步。其中&#xff0c;聊天机器人技术作为NLP领域的一个重要应用&#xff0c;已经广…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...