【问题标题】:Update Cached Image in Flutter在 Flutter 中更新缓存的图像
【发布时间】:2022-01-04 14:41:24
【问题描述】:

我有一个问题,我正在使用cached_network_image 包从网络缓存图像,我的问题是,我们可以更新缓存的图像吗?因为如果我更新图像(URL 保持不变),应用程序将显示旧图像而不是新图像,我需要先清除缓存以使应用程序显示最新图像。或者缓存的图像是否有过期时间?谢谢。

 CachedNetworkImage(
    imageUrl: dokter.foto,
    imageBuilder: (context, imageProvider) => CircleAvatar(backgroundImage: imageProvider),
    progressIndicatorBuilder: (context, url, downloadProgress) =>
       Center(
         child: CircularProgressIndicator(
              value: downloadProgress.progress,
              color : Constant.color
         ),
       ),
   errorWidget: (context, url, error) =>   Image.asset("assets/images/profileAvatar.png")
)

【问题讨论】:

  • 你能详细描述一下吗?
  • @DipakRamoliya 好的,简单来说,如果我更新图像但使用相同的 URL,它将显示旧图像而不是最新图像,所以我想知道是否有任何方法可以更新图像而不是清除缓存。
  • 当你更新新图像时使用时间戳而不是使用名称

标签: flutter


【解决方案1】:

根据issue,如果 url 相同,则需要一些时间才能更新。我没有在小部件本身上看到任何过期属性。相反,您可以使用 cacheKey 来设置您希望它有效的时间。例如,如果它只需要在一天内保持有效,您可以使用:

CachedNetworkImage(
      imageUrl: dokter.foto,
      cacheKey: dokter.foto + DateTime.now().day.toString(),
)

如果需要一个小时或一个月,这非常简单,您可以将天替换为小时或月。尽管在某些天数内,您可能需要做一些数学运算。 7 天你可以简单地做(DateTime.now().day / 7).floor()。当然,有一些极端情况,根据缓存的时间,如果您将其设置为一天,它可能仅在一个小时内有效,而不是 24 小时。但是,如果您只需要设置它保持有效的最长时间而不是让小部件本身处理它,那么这很简单并且应该可以正常工作。

更新

假设您使用 (DateTime.now().hour 将最长过期时间设置为 1 小时。早上 9 点,用户下载并缓存了第一张图片。上午 10 点之前,上传了一张新图片。 cacheKey 在上午 10 点更改,因此下载并缓存了新图像。到目前为止,一切都很好。问题是第二天上午 9 点到 10 点,您的cacheKey 将用于检索第一张过时的图像。要解决此问题,您可以将日期和时间连接在一起。但尚不清楚cacheKeys 的有效期有多长。因此,如果密钥在那么长的时间内仍然有效,一周后可能会发生同样的问题。

CachedNetworkImage.evictFromCache(url, cacheKey: cacheKey);

您可以使用它来删除旧的cacheKey 以防止这种情况发生。

【讨论】:

  • 那么如果当前时间超过cacheKey,它会从url重新下载图片吗?
  • @AnandaPramono 是的,因为默认情况下 url 被用作缓存键。一旦你明确地提供了一个缓存键,它将被使用而不是 url。如果您在小时更改后使用DateTime.now().hour,那么您的缓存键也会更改,这就像给它一个新的url。但是,如果您使用小时,这可能会有问题。我会更新我的答案来解释这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2012-08-02
  • 2020-06-01
  • 2018-11-29
相关资源
最近更新 更多