【Flutter 专题】42 图解页面截屏与本地保存小尝试
小菜因特别需求想尝试一下 Flutter 页面截屏并将图片保存在本地的功能,记录一下尝试过程。
RepaintBoundary
Flutter 提供了支持截屏的 RepaintBoundary,在需要截取部分的外层嵌套,也可以截取某一子 Widget 内容;RepaintBoundary 的结构很简单,通过 key 来判断截取的 RenderObject,最终生成一个 RenderRepaintBoundary 对象;
ui.Image
通过 RenderRepaintBoundary 获取的对象 .toImage() 后转为 ui.Image 类型字节流,最终存储为 png 格式,在转为常用的 Uint8List 存储在内存中,借助 image.memory() 方式展示在具体位置;而当前只是获取到图片的流信息,仅可用于操作,还未存储在本地;
toByteData() 生成的数据格式一般分三种:
rawRgba:未解码的 byte;
rawUnmodified:未解码且未修改的 byte,如灰度图;
png 为我们常用的 PNG 图片;
Directory
若需要存储本地,跟 Android/iOS 类似,首先获取存储路径,再进行存储操作;小菜借助三方插件 path_provider 来获取图片路径;
path_provider 提供了 getTemporaryDirectory 临时路径 / getApplicationDocumentsDirectory 全局路径等,可以根据不同的需求存储不同路径;
小菜为了测试方便选择存放在设备根目录下 getExternalStorageDirectory;
writeAsBytes
文件的保存很简单,直接将 Uint8List 写入到所在文件路径下即可;
但此时存储或自定义文件路径,可能会遇到权限问题,小菜为了测试方便在 Android 中添加读写权限,并手动在设备中打开,之后便可正常存储;
小菜对文件存储还很不熟悉,对于动态申请权限方面也在学习过程中,会在今后的博客中逐渐整理,如有不对的地方请多多指导!
来源:阿策小和尚
版权声明: 本文为 InfoQ 作者【阿策小和尚】的原创文章。
原文链接:【http://xie.infoq.cn/article/e66fd38e7d14fd974b06fdd42】。文章转载请联系作者。
评论