【问题标题】:how to clear cache in CachedNetworkImage flutter如何清除CachedNetworkImage颤动中的缓存
【发布时间】:2019-11-25 07:27:48
【问题描述】:

我不想将图像存储在缓存中。我正在使用 CachedNetworkImage 进行图像加载。 我想知道是否有任何选项可以删除或不将图像存储在缓存中,如毕加索..

我的代码:

var annotatedImg = CachedNetworkImage(
      fit: BoxFit.fill,
      imageUrl: Constants.IMAGE_BASE_URL + widget._fileId + Constants.CONTOUR_IMG_SUFFIX,
      placeholder: (context, url) => progressBar,
      errorWidget: (context, url, error) => new Icon(Icons.error),
    );

我试过了

annotatedImg.cacheManager.emptyCache();

但它的显示不能调用emptyCache为null..

【问题讨论】:

  • 很沮丧,没有任何信息或代码来删除或替换我真正需要做的该死的缓存文件:/

标签: android caching flutter


【解决方案1】:

我同意 MichaelM,不要使用 CachedNetworkImage。如果您显示这样的图像:

Image.network(
      _headImageUrl,
      fit: BoxFit.fitHeight,
    )

您可以使用这些代码来清理图像缓存:

PaintingBinding.instance.imageCache.clear();

【讨论】:

  • 非常感谢您的回答。我为删除的图像苦苦挣扎了三个月,但它们一直出现在屏幕上。我很沮丧,因为这对我来说没有任何意义。看到您的回答后,我在删除图像后添加了 PaintingBinding.instance.imageCache.clear() 并且它终于起作用了。再次,非常感谢你,这真的帮助了我。
  • 这会清除整个图像缓存。最好像这样删除一个图像提供程序:_imgProvider = NetworkImage(url); _imgProvider.evict(); 在加载图像之前确保将其从缓存中清除。
【解决方案2】:

由于 CachedNetworkImage 2.3 版,所有这些解决方案将不起作用,因为它将图像缓存在 2 个不同的位置(DefaultCacheManager 和 NetworkImageProvider)

所以唯一的解决方案是使用来自CachedNetworkImageevictFromCache 内置方法

像这样:

Future _deleteImageFromCache() async {
    String url = "your url";
    await CachedNetworkImage.evictFromCache(url);
  }

evictFromCache 是一个静态方法,因此它不需要在您的 Widget 树中包含 CachedNetworkImage,您可以在任何地方直接使用它。

【讨论】:

    【解决方案3】:

    首先将包(flutter_cache_manager)添加到pubspec.yaml文件中,如下:

    依赖: 扑: sdk:颤动 flutter_cache_manager:^1.1.3

    一天后,我找到了解决方案。通过调用 emptyCache() 方法使用 DefaultCacheManager 对象,这将清除缓存数据。

    DefaultCacheManager manager = new DefaultCacheManager();
    manager.emptyCache(); //clears all data in cache.
    

    【讨论】:

      【解决方案4】:

      import 'package:flutter_cache_manager/flutter_cache_manager.dart'; await DefaultCacheManager().removeFile('YOUR_URL');

      不要使用第一个答案中的 emptyCache(),它会清除所有缓存

      【讨论】:

      • 如果应用没有重启,它不会清除缓存。有什么办法可以解决吗?
      • @SteevJames 对我来说它可以在不重新启动应用程序的情况下工作!
      【解决方案5】:

      CachedNetworkImage 将图像存储在临时(缓存)文件夹中,您可以使用path_providergetTemporaryDirectory() 方法访问它。在那里你会找到libCachedImageData(你可能需要检查名字)。在那里你可以删除文件夹。

      要在您的应用中执行此操作,您应该使用 Directory 类,例如:

      final Directory tempDir = await getTemporaryDirectory();
      final Directory libCacheDir = new Directory("${tempDir.path}/libCachedImageData");
      await libCacheDir.delete(recursive: true);
      

      【讨论】:

        【解决方案6】:

        如果您不想将下载的图像存储在缓存中,请不要使用CachedNetworkImage。相反,使用带有 NetworkImage 的 FadeInImage 小部件:

        FadeInImage(
          // here `bytes` is a Uint8List containing the bytes for the in-memory image
          placeholder: // This should be an image, so you can't use progressbar,
          image: NetworkImage('https://backend.example.com/image.png'),
        )
        

        【讨论】:

        • 我想在占位符中显示进度条
        【解决方案7】:

        在您的 CachedNetworkImage 中,添加 CacheManager Config:

        CachedNetworkImage(CacheManager(Config(
                      featureStoreKey,
                      stalePeriod: const Duration(seconds: 15),
                      maxNrOfCacheObjects: 1,
                      repo: JsonCacheInfoRepository(databaseName: featureStoreKey),
                      fileService: HttpFileService(),
                    ),
                ),
          fit: BoxFit.fill,
          imageUrl: Constants.IMAGE_BASE_URL + widget._fileId + Constants.CONTOUR_IMG_SUFFIX,
          placeholder: (context, url) => progressBar,
          errorWidget: (context, url, error) => new Icon(Icons.error),
        );
        

        然后要清除它,添加这个 void 语句:

        void _clearCache() {
        try {
          JsonCacheInfoRepository(databaseName: featureMain1Store).deleteDataFile();
        } catch (e, s) {
          print(s);
        }
        imageCache!.clear();
        imageCache!.clearLiveImages();
        setState(() {});
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-24
          • 1970-01-01
          • 2019-03-08
          • 2014-08-19
          • 2012-02-24
          • 2012-01-31
          • 2017-02-20
          相关资源
          最近更新 更多