qiuxiang / qiuxiang

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

优雅地实现 Flutter 跨平台图片保存

qiuxiang opened this issue · comments

commented

有时候我们需要用 flutter 生成图片(比如 RenderRepaintBoundary.toImage)并保存成文件。目前主流的实现都是通过 MethodChannel 把数据发到原生端进行保存,如果只是支持一两个平台还好,要支持全平台,开发和维护成本将变得很高,所以目前也没有哪个库支持 android + ios 以外的平台。

其实我们完全可以用 dart 的 io 模块进行文件写入,桌面环境显然是没有问题的,而 android 端在权限允许的情况下也可以成功写入,那么剩下问题就是怎么处理 web 和 ios 而已了。

ios 由于系统原因,只能用原生接口写入系统相册,按主流方式处理即可。

web 版可能会比较棘手,因为 web 不能使用 io 模块,flutter 官方显然意识到了这个问题,于是提出了新的跨平台文件库 XFile,这是目前跨平台文件处理的最佳实践,官方库 pick_file、file_selector 最新版都已经是返回 XFile。

于是得益于 XFile 提供的 fromDatasaveTo 方法,在不需要做什么处理情况下即可实现除 ios 外其他平台的图片保存功能。

对于 android,也只需要处理好以下问题:

  1. 外部存储写入权限申请,包括 manifest 里的权限声明和运行时权限申请。

  2. 通过原生接口获取外部存储 Pictures 目录路径,将文件写入该目录,需要注意的是从 android 11 开始,WRITE_EXTERNAL_STORAGE
    权限就只能写入媒体目录,写入其他目录会被拒绝。android 10 很特殊,必须声明
    <application android:requestLegacyExternalStorage="true"> 才能正常写入。

  3. 调用原生接口通知 android 系统更新图片索引。

虽然使用 media 接口是更好的做法,但目前继续使用 io 接口写入文件也不是什么问题,只要符合规范

最后放出具体实现:https://github.com/qiuxiang/flutter_image_saver