在 Flutter 中本地缓存 base64 图像
Posted
技术标签:
【中文标题】在 Flutter 中本地缓存 base64 图像【英文标题】:Cache base64 images locally in Flutter 【发布时间】:2021-05-17 16:23:08 【问题描述】:我自己的方法有以下问题。如果有更好的方法来做我所做的事情,我想要一些意见。
在我的应用程序中,我从无法更改太多的来源获取图像。有例如包含一些关于他们的信息和头像的用户列表。我从一个将头像作为 bas64 字符串发送的 Rest API 获取数据。由于 base64 编码的图像字符串可能会变得很长,我的想法是第一次获得图像时,我将对其进行解码并使用 path_provider 插件将其保存在临时目录中。
现在看起来像这样:
Future<void> getMediaFile(int id) async
Directory temp = await getTemporaryDirectory();
File imageFile = File('$temp.path/images/$id.toString().jpg');
var response = await _httpClient.getRequest(ApiPath.mediaFileById(id.toString()));
var mediaFile = MediaFile.fromJson(response["mediafile"]);
Uint8List decodedImage = base64Decode(mediaFile.fileContent);
await imageFile.create(recursive: true);
await imageFile.writeAsBytes(decodedImage);
每当我需要媒体文件时,我都会检查本地是否已经存在具有特定 ID 的媒体文件。
有没有更好的方法来做到这一点? 这种做法是不是因为其他原因不好?
我找到了一个“cached_network_image”包,但这只能在我通过 url 获取图像时使用,我不能这样做,因为在这种情况下我无法更改后端。
【问题讨论】:
【参考方案1】:与许多这样的问题一样,“这取决于”。
对于少量的小(
如果您要在每个页面上显示更大的图像,那么在您的应用程序启动时(在第一次保存到本地文件系统之后)将图像加载到内存中可能是值得的。
如果它只是一个 128x128 的 PNG 头像,我怀疑它会有所作为(考虑到所有因素,我希望尽可能少地保留内存,所以在这种情况下,我只需从文件系统加载)。
cached_network_image 仅用于缓存从网络检索到的图像,还有一些额外的细节来显示占位符,所以这并不相关。
【讨论】:
以上是关于在 Flutter 中本地缓存 base64 图像的主要内容,如果未能解决你的问题,请参考以下文章
将base64字符串编码的图像/字节图像作为图像在Flutter中用于Firebase ML Vision中进行处理
从 Expo 的缓存中以 base64 格式读取文件,写入 Firebase 存储(Cloud Storage for Firebase)
Flutter ListView base64图像与Image.memory一起显示时闪烁
如何在 Flutter 中缓存来自 Firebase 的图像?