在 Flutter 中本地缓存 base64 图片

Cache base64 images locally in Flutter

我自己的方法有以下问题。如果有更好的方法来完成我所做的事情,我希望得到一些意见。

在我的应用程序中,我从无法更改太多的来源获取图像。有例如包含一些关于他们的信息和头像的用户列表。我从 Rest API 获取数据,其中头像作为 bas64 字符串发送。由于 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 获取图像时使用,我不能这样做,因为我无法更改在这种情况下是后端。

对于很多这样的问题,“视情况而定”。

对于少量 (<100kb)、不经常访问的文件,这是一种合理的方法。文件系统访问通常足够快,可以避免任何明显的延迟问题。

如果要在每个页面上显示更大的图片,可能值得在应用程序启动时(在第一次保存到本地文件系统后)将图像加载到内存中。

如果它只是一个 128x128 的 PNG 头像,我怀疑它是否会有所作为(考虑到所有因素,我希望尽可能少地保留内存,所以在这种情况下我只是从文件系统加载) .

cached_network_image 仅用于缓存从网络检索到的图像,还有一些额外的细节来显示占位符,因此这并不是真正相关的。