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

简介: 在开发app中,卡片分享功能可以为用户提供更好的交互和共享体验,我猜大家在开发的过程中也会有很大的概率碰上这样的需求。本文将带你学会如何在Flutter应用中实现卡片分享,提升用户体验~

前言

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

效果图:

实现方案

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

创建弹窗&卡片布局

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

操作项组件封装:

class ImageDialog extends StatelessWidget {

 const ImageDialog({

   Key? key,

   required this.items,

  ...

 }) : super(key: key);

 final List<ItemLittleView> items;

...


@override

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。

相关文章
在 Flutter 中制作翻转卡片动画的两个完整示例
本文将带您了解在 Flutter 中制作翻转卡片动画的两个完整示例。第一个示例从头开始实现,第二个示例使用第三方包。闲话少说,让我们动手吧。
591 0
|
1月前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
5月前
|
开发框架 前端开发 测试技术
Flutter开发常见问题解答
Flutter开发常见问题解答
|
1月前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
73 3
|
15天前
|
传感器 开发框架 物联网
鸿蒙next选择 Flutter 开发跨平台应用的原因
鸿蒙(HarmonyOS)是华为推出的一款旨在实现多设备无缝连接的操作系统。为了实现这一目标,鸿蒙选择了 Flutter 作为主要的跨平台应用开发框架。Flutter 的跨平台能力、高性能、丰富的生态支持和与鸿蒙系统的良好兼容性,使其成为理想的选择。通过 Flutter,开发者可以高效地构建和部署多平台应用,推动鸿蒙生态的快速发展。
127 0
|
17天前
|
Dart 安全 UED
Flutter&鸿蒙next中的表单封装:提升开发效率与用户体验
在移动应用开发中,表单是用户与应用交互的重要界面。本文介绍了如何在Flutter中封装表单,以提升开发效率和用户体验。通过代码复用、集中管理和一致性的优势,封装表单组件可以简化开发流程。文章详细讲解了Flutter表单的基础、封装方法和表单验证技巧,帮助开发者构建健壮且用户友好的应用。
58 0
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
76 7
|
1月前
|
编解码 Dart API
鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件
本文介绍了如何开发一个 Flutter 鸿蒙插件,实现 Flutter 与鸿蒙的混合开发及双端消息通信。通过定义 `MethodChannel` 实现 Flutter 侧的 token 存取方法,并在鸿蒙侧编写 `EntryAbility` 和 `ForestPlugin`,使用鸿蒙的首选项 API 完成数据的读写操作。文章还提供了注意事项和参考资料,帮助开发者更好地理解和实现这一过程。
56 0
|
1月前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
48 0
|
2月前
|
JSON Dart Java
flutter开发多端平台应用的探索
flutter开发多端平台应用的探索
50 6