首页 > 解决方案 > 用户向下滚动屏幕后如何清除图像缓存,如果向上滚动则重新加载?

问题描述

用户向下滚动屏幕后如何清除图像缓存,如果向上滚动则重新加载?

我有一个懒惰的列表视图,而用户向下滚动带有图像的新闻卡是从网络加载的。当许多图像加载到 500 左右时,应用程序开始“慢”,我想这是因为缓存中有很多图像,我的图像只有 100 像素。

标签: flutterdart

解决方案


重要说明,只是在图像缓存中包含更多图像不太可能导致性能下降,尤其是当您使用ListView.builder(). 检查您没有在调试模式下运行,这会严重损害性能,并确保在尝试优化性能之前进行配置。

话虽如此,如果您知道 Flutter 的图像缓存中图像的密钥,则可以通过调用来删除图像

imageCache!.evict(key);

不同类型的ImageProvider密钥不同,但鉴于您是从网络获取图像,我假设您正在使用NetworkImage(或在引擎盖下Image.network使用)。NetworkImage

然后,您可以创建一个包装 Widget 的 Widget Image,并在它被处理后将其从缓存中逐出。也许是这样的:

class DisposingNetworkImage extends StatefulWidget {
  final NetworkImage image;
  // boilerplate
}

class DisposingNetworkImageState extends State<DisposingNetworkImage> {
  @override
  void dispose() {
    imageCache!.evict(widget.image);
    super.dispose();
  }

  @override
  Widget build(BuildContext) => Image(
    image: widget.image,
  );
}

然后您可以在其他小部件中使用它,例如:

DisposingNetworkImage(image: NetworkImage('https://example.com/my-image'))

推荐阅读