需求
画报分享,常见于电商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插件