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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Flutter是一种跨平台的移动应用开发框架,可以用于开发iOS和Android应用。在Flutter实现微博分享可以通过集成第三方的微博SDK来实现。 首先,在pubspec.yaml文件中添加微博SDK的依赖: ``` dependencies: fluwx: ^x.x.x #微信开发包 umeng_sdk: ^x.x.x #友盟统计SDK weibo_sdk: ^x.x.x #微博SDK ``` 然后,在Flutter的代码中,添加微博分享的逻辑。首先,用户需要先登录微博,获取到授权信息。可以使用微博SDK提供的登录接口来实现: ```dart import 'package:weibo_sdk/weibo_sdk.dart'; void loginWeibo() async { var response = await WeiboSDK.login(); if (response != null && response.isSuccess()) { // 授权成功 var accessToken = response.accessToken; var uid = response.uid; // 在这里可以进行微博分享的操作 } else { // 授权失败 } } ``` 在获取到授权信息后,就可以通过微博SDK提供的分享接口来实现微博分享: ```dart import 'package:weibo_sdk/weibo_sdk.dart'; void shareToWeibo() { var weiboContent = WeiboContent(); weiboContent.title = '分享标题'; weiboContent.description = '分享内容'; weiboContent.webpageUrl = '分享链接'; weiboContent.imageUrl = '分享图片链接'; WeiboSDK.shareToWeibo(weiboContent).then((response) { if (response != null && response.isSuccess()) { // 分享成功 } else { // 分享失败 } }); } ``` 通过上述的代码实现,就可以在Flutter中进行微博分享了。当用户点击分享按钮时,首先需要登录微博获取授权信息,然后再调用分享接口进行分享操作。使用微博SDK可以方便地实现微博分享功能,同时也提供了分享成功和失败的回调,方便开发者对分享结果进行处理。 ### 回答2: Flutter 是一种开源的移动应用程序开发框架,它能够帮助开发者用一套代码构建高效、美观的跨平台应用。在 Flutter 中,我们可以很方便地实现微博分享功能。 首先,我们需要引入 `flutter_weibo` 插件,这是一个与微博 API 交互的插件。我们可以在 `pubspec.yaml` 文件中添加依赖: ``` dependencies: flutter_weibo: ^1.0.0 ``` 然后,在我们的代码中导入该插件: ```dart import 'package:flutter_weibo/flutter_weibo.dart'; ``` 接下来,我们需要设置微博开放平台的相关信息,包括 App Key 和回调地址。我们可以在微博开放平台申请一个开发者账号,创建一个应用,然后获取这些信息。在我们的代码中,可以这样设置: ```dart Weibo.init('YOUR_APP_KEY', 'YOUR_REDIRECT_URL'); ``` 现在,我们就可以使用该插件来实现微博分享了。比如,我们可以创建一个按钮,点击该按钮时触发分享操作: ```dart FlatButton( onPressed: () { // 分享文本 Weibo.shareText('要分享的文本内容'); // 分享图片(本地图片或网络图片) Weibo.shareImage( image: 'http://example.com/image.jpg', description: '图片描述', ); // 分享网页链接 Weibo.shareWebPage( url: 'http://example.com/page', title: '网页标题', description: '网页描述', thumbnail: 'http://example.com/thumbnail.jpg', ); }, child: Text('点击分享到微博'), ); ``` 通过上述代码,我们可以实现微博分享功能。用户点击按钮后,可以分享文本、图片或网页链接到微博上。当然,在实际开发中,我们还可以根据需求进行更多的定制和优化,以提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程的平行世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值