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

news/2024/11/14 22:49:55/

前言

在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.ppmy.cn/news/622764.html

相关文章

什么是数据驱动决策?方案、示例一次讲透

目录 一、什么是数据驱动决策&#xff1f; 1.数据驱动决策的由来 2. 如何实现数据驱动决策 3.数据驱动决策案例 案例一&#xff1a;汉莎航空 案例二&#xff1a;沃尔玛 二、精细化数据驱动决策软件解决方案 1.大数据采集和分析类 2.客户数据 3.商业智能BI 4.客户数据…

Windows批处理 遍历当前文件夹 循环删除指定文件

::echo off rem 正在搜索... rem 删除文件 for /f "delims" %%i in (dir /b /a-d /s "*.pb.cc") do del %%i rem 删除完毕 pause 删除指定*.pb.cc 文件。

利用批处理脚本批量删除电脑上的空文件夹

echo off for /f "tokens*" %%i in (dir/s/b/ad^|sort /r) do rd "%%i"使用"记事本"编写,保存为.txt文件,直接将其修改为.bat即可 使用时复制到相应的文件夹路径下&#xff0c;双击运行即可。 可循环删除当前路径的所有空文件夹&#xff0c;包括…

批处理对文件夹、所有子文件夹内的文件重命名、删除

一、删除操作 echo off echo Welcome REM 操作目录 set use_dirD:\ddd REM 删除文件的名称 set del_nameaaa.txt echo. set /p con按回车开始 echo. setlocal enabledelayedexpansion for /f %%s in (dir %use_dir% /s /b /a:-d) do (set old_name%%~nsset ext_name%%~xsif &q…

图片文字处理 ocr

1、概述 有时候我们需要获取到图片的文字&#xff0c;但是了&#xff0c;图片的文字内容多元化&#xff0c;不同语言随时变化&#xff0c;需要一个利器来快速、准确识别到图片的文字还是有点难度&#xff0c;本文推荐python easyocr,相关环境部署&#xff0c;自行去学&#xf…

(批处理)批量删除jpg文件名前几位字符和后几位字符

仅以问题中的说明及猜测为据&#xff1b;以下代码复制粘贴到记事本&#xff0c;另存为xx.bat&#xff0c;编码选ANSI&#xff0c;跟要处理的文件放一起双击运行 echo off&cd /d "%~dp0"&mode con lines5000 rem 将当前目录里的多个jpg图片文件的名称的前几位…

(批处理)把文件夹中所有的照片按拍摄日期和时间批量重命名

例如比如文件夹中有一张照片拍摄日期是2014年2月2日18点20分,执行批处理文件后,会自动将此照片名称修改为" 2013-02-02 18点20分拍摄" <# : cls&echo off&cd /d "%~dp0"&mode con lines=5000 rem 在当前目录里多个jpg图片文件名称开头前面…

批量OCR识别图片中的文字

临时有个需求&#xff0c;需要从几万张图片中提取指定的文字并保存到数据库&#xff0c; 于是写了这个小工具&#xff0c;方便自用。 软件界面如图&#xff1a; 双击第一个窗口&#xff0c;导入需要批量识别的图片&#xff0c;再点击开始即可批量识别图片中的文字&#xff0c; …