在 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 的图像?

如何将存储在数据库中的 Base64 字符串集合转换为普通图像存储在本地目录中

Matplotlib 图形图像转 base64