Flutter卡片分享功能实现:将你的内容分享给世界

前言

在app中,在实现分享功能的时候,通常会有一种以卡片形式展示和分享内容的分享方式。这种功能可以将信息以整洁、易读的方式呈现给用户,使他们能够快速了解内容的关键信息,并将其分享给其他人。那么在这篇文章中,就一起来探索下,如何使用Flutter来实现这卡片分享功能吧~

源代码:https://www.aliyundrive.com/s/FH7Xc2vyLvC

效果图:

实现方案

为了卡片的样式的灵活性和可定制性,本文采用对组件进行截图的方式来实现卡片保存分享的功能,选择这个方案还有一点好处就是充分利用了flutter跨平台的优势。当然也会有一定的缺点,例如对于性能的考虑,当对复杂的嵌套卡片组件截图时,渲染和图像转换的计算量是需要考虑的,当然也可以选择忽略不计~

创建弹窗&卡片布局

在生成分享卡片的同时还会有其他的操作选项,例如保存图片、复制链接、浏览器打开等等,所以通常分享卡片的形式为弹窗形式,中间为分享卡片主体,剩余空间为操作项。

操作项组件封装:

class ImageDialog extends StatelessWidget {const ImageDialog({Key? key,required this.items,...}) : super(key: key);final List<ItemLittleView> items;...
Widget build(BuildContext context) {return Column(mainAxisAlignment: MainAxisAlignment.end,children: [Container(...child: Row(children: items.map((e) => itemLittleView(label: e.label,icon: e.icon,onTap: () {Navigator.pop(context);e.onTap?.call();})).toList()),),],);
}Widget itemLittleView({required String label,required String icon,Function()? onTap,}) =>InkWell(onTap: onTap,child: Container(margin: EdgeInsets.only(right: 10),child: Column(mainAxisAlignment: MainAxisAlignment.end,children: [Container(//图标),Container(//文字),],),),);}
}class ItemLittleView {final String label;final String icon;final Function()? onTap;ItemLittleView({required this.label, required this.icon, this.onTap});
}

需要加入新的操作项时,只需要简单的添加一个ItemLittleView即可。

ImageDialog(items: [ItemLittleView(label: "生成图片 ",icon: "assets/images/icon/ic_down.png",onTap: () => doSaveImage(),),...],
),

卡片的布局则根据业务的需求自定义即可,本文也只是一个简单的例子。

渲染并截取组件截图

在flutter中可以使用RepaintBoundary将将组件渲染为图像。

  • 第一步:定义全局的GlobalKey,用于获取卡片布局组件的引用
var repaintKey = GlobalKey();RepaintBoundary(key: repaintKey,//分享卡片child: shareImage(),
),
  • 第二步:使用RenderRepaintBoundary的toImage方法将其转换为图像
Future<Uint8List> getImageData() async {BuildContext buildContext = repaintKey.currentContext!;//用于存储截取的图片数据var imageBytes;//通过 buildContext 获取到 RenderRepaintBoundary 对象,表示要截取的组件边界RenderRepaintBoundary boundary =buildContext.findRenderObject() as RenderRepaintBoundary;//这行代码获取设备的像素密度,用于设置截取图片的像素密度double dpr = ui.window.devicePixelRatio;//将边界对象 boundary 转换为图像,使用指定的像素密度。ui.Image image = await boundary.toImage(pixelRatio: dpr);// image.width//将图像转换为ByteData数据,指定了数据格式为 PNG 格式。ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);//将ByteData数据转换为Uint8List 类型的图片数据。imageBytes = byteData!.buffer.asUint8List();return imageBytes;
}
  • 第三步:获取权限&保存截图
//获取权限
_requestPermission() async {Map<Permission, PermissionStatus> statuses = await [Permission.storage,].request();final info = statuses[Permission.storage].toString();
}Future<String> saveImage(Uint8List imageByte) async {//将回调拿到的Uint8List格式的图片转换为File格式//获取临时目录var tempDir = await getTemporaryDirectory();//生成file文件格式var file =await File('${tempDir.path}/image_${DateTime.now().millisecond}.png').create();//转成file文件file.writeAsBytesSync(imageByte);print("${file.path}");String path = file.path;return path;
}//最后通过image_gallery_saver来保存图片
/// 执行存储图片到本地相册void doSaveImage() async {await _requestPermission();Uint8List data = await getImageData();String path = await saveImage(data);final result = await ImageGallerySaver.saveFile(path);showDialog(context: context,builder: (_) {return AlertDialog(title: Text("保存成功!"),);});}

到这里,分享卡片的功能就实现啦~

总结

在本文中,我们探索了使用Flutter实现卡片分享功能的过程。在开发app时,卡片分享功能可以为用户提供更好的交互和共享体验,我猜大家在开发的过程中也会有很大的概率碰上这样的需求。通过设计精美的卡片样式,可以帮助更快速的推广APP。

关于我

Hello,我是Taxze,如果您觉得文章对您有价值,希望您能给我的文章点个❤️,有问题需要联系我的话:我在这里。如果您觉得文章还差了那么点东西,也请通过关注督促我写出更好的文章~万一哪天我进步了呢?😝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4569.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python: more Layer Architecture and its Implementation in Python

sql server: --学生表 DROP TABLE DuStudentList GO create table DuStudentList (StudentId INT IDENTITY(1,1) PRIMARY KEY,StudentName nvarchar(50),StudentNO varchar(50), --学号StudentBirthday datetime --学生生日 ) go mod…

UE4 Cesium离线生成地形

地理空间数据云 首先进这个网址&#xff0c;下载对应的tif以及高程&#xff08;DEM&#xff09; 下载CesiumLab2 在地形切片中点击添加&#xff0c;将黑白图像数据&#xff0c;添加&#xff0c;选择存储类型为散列文件&#xff0c;选择输出路径 再选择影像切片&#xff0c;选择…

Sublime Text 初步使用

Sublime Text &#xff0c;最初被设计为一个具有丰富扩展功能的Vim。 Sublime Text具有漂亮的用户界面和强大的功能&#xff0c;例如代码缩略图&#xff0c;Python的插件&#xff0c;代码段等。还可自定义键绑定&#xff0c;菜单和工具栏。Sublime Text 的主要功能包括&#xf…

PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉

我们在深度学习中可以发现有很多不同格式的模型文件&#xff0c;比如不同的框架就有各自的文件格式&#xff1a;.model、.h5、.pb、.pkl、.pt、.pth等等&#xff0c;各自有标准就带来互通的不便&#xff0c;所以微软、Meta和亚马逊在内的合作伙伴社区一起搞一个ONNX(Open Neura…

jupyter notebook优化

一&#xff0e;这个是jupyter notebook主题设置的相关教程&#xff0c;如果经常看着高亮的屏幕&#xff0c;对于眼睛会是一种损伤&#xff01; https://blog.csdn.net/qq_41566627/article/details/104984796?utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7…

乐鑫线上研讨会|探索 LCD 屏在物联网中的发展趋势

LCD 屏通过显示实时信息并提供交互式体验&#xff0c;现已成为各类设备的重要组成部分。在当下的 AIoT 时代&#xff0c;随着物联网技术的快速发展和应用场景的不断拓展&#xff0c;LCD 作为人机交互的主要输入输出设备&#xff0c;在智能家居、智能安防、工业控制、智慧城市等…

react封装jsoneditor

1、安装&#xff1a; api文档&#xff1a;jsoneditor npm install jsoneditor2、代码&#xff1a; JsonEditor/index.tsx: import { useMemoizedFn } from ahooks; import JSONEditor from jsoneditor; import { useEffect, useState } from react; import ./index.less;in…

redis 主从复制 哨兵 安装部署

学习开始前先了解一下 Redis是一个开源的内存数据结构存储系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。Redis最大的特点是数据存储在内存中&#xff0c;因此读写速度非常快&#xff0c;同时也支持数据持久化&#xff0c;可以将数…

【K8S系列】如何高效查看 k8s日志

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 Kubernetes (k8s) 是一个容器编排平台&#x…

AndroidStudio xml布局文件输入没有提示

AndroidStudio xml布局文件输入没有提示&#xff0c;如下图&#xff1a; 原因是老的AndroidStudio与新的sdk版本不一致 方法1&#xff1a;修改compileSdkVersion低于33即可&#xff0c;不建议 方法2&#xff1a;升级AndroidStudio版本&#xff0c;建议 如下是我的AndroidStu…

Docker部署(1)——将jar包打成docker镜像并启动容器

在代码编写完成即将部署的时候&#xff0c;如果采用docker容器的方法&#xff0c;需要将jar包打成docker镜像并通过镜像将容器启动起来。具体的步骤如下。 一、首先下载java镜像 先使用docker search java命令进行搜索。 然而在拉取镜像的时候要注意不能直接去选择pull java ,…

改进的白鲸优化算法

改进的白鲸优化算法 一、算法灵感二、算法介绍2.1 初始化2.2 探索阶段2.3 开发阶段2.4 鲸落阶段 三、改进的白鲸优化算法3.1 集体行动策略3.2 小孔成像策略3.3 二次插值策略3.4 IBWO伪代码 一、算法灵感 白鲸优化算法(Beluga whale optimization, BWO)是2022年提出的一种元启发…