flutter 保存分享海报、画报

需求

画报分享,常见于电商APP
在这里插入图片描述

效果实现

1 写布局
在这里插入图片描述
2 将需要导出的内容用RepaintBoundary包裹

在这里插入图片描述
注意:需要生成一个key,并赋给RepaintBoundary,后面要用到
在这里插入图片描述
3 编写点击事件
3.1 判断是否有保存图片的权限
使用permission_handler插件

PermissionStatus status = await Permission.storage.status;
      if (!status.isGranted) {
        status = await Permission.storage.request();
        return;
      }

3.2 将组件生成图片

BuildContext buildContext = _repaintKey.currentContext;
RenderRepaintBoundary boundary = buildContext.findRenderObject();
ui.Image image = await boundary.toImage();
ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.png);

注意:await boundary.toImage();返回的是 ui.Image ,其中Image就是 dart:ui中的Image,面前加的ui,需要在导入包的时候as。

import 'dart:ui' as ui;

3.3 保存图片
使用image_gallery_saver插件

final result = await ImageGallerySaver.saveImage(byteData.buffer.asUint8List());
if(result['isSuccess']){
    DialogUtils.toast('保存成功');
    Navigator.of(context).pop();
}else{
    DialogUtils.toast('保存失败:${result['errorMessage']}');
}

整体代码

	_saveImage() async {
      //存储权限
      PermissionStatus status = await Permission.storage.status;
      if (!status.isGranted) {
        status = await Permission.storage.request();
        return;
      }

      BuildContext buildContext = _repaintKey.currentContext;
      if (null != buildContext){
        RenderRepaintBoundary boundary = buildContext.findRenderObject();
        ui.Image image = await boundary.toImage();
        ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.png);
        final result = await ImageGallerySaver.saveImage(byteData.buffer.asUint8List());
        if(result['isSuccess']){
          DialogUtils.toast('保存成功');
          Navigator.of(context).pop();
        }else{
          DialogUtils.toast('保存失败:${result['errorMessage']}');
        }
      }
    }

最终效果

点击保存后,可以在相册内找到
在这里插入图片描述

PS

生成二维码使用qr_flutter插件

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值