簡體   English   中英

如何清除CachedNetworkImage顫動中的緩存

[英]how to clear cache in CachedNetworkImage flutter

我不想將圖像存儲在緩存中..我正在使用 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為空..

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

依賴項:flutter:sdk:flutter flutter_cache_manager:^1.1.3

一天后,我找到了解決方案。 通過調用 emptyCache() 方法使用 DefaultCacheManager 對象,這會清除緩存數據。

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

我同意 MichaelM,不要使用 CachedNetworkImage。如果你顯示這樣的圖像:

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

您可以使用這些代碼來清理圖像緩存:

PaintingBinding.instance.imageCache.clear();

由於 CachedNetworkImage版本 2.3 ,所有這些解決方案都不起作用,因為它在 2 個不同的地方緩存了圖像(DefaultCacheManager 和 NetworkImageProvider)

所以,唯一的解決辦法是使用evictFromCache內置的方法從CachedNetworkImage

像這樣:

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

evictFromCache是一個靜態方法,因此它不需要在您的 Widget 樹中有CachedNetworkImage ,您可以直接從任何地方使用它。

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

不要從第一個答案中使用 emptyCache(),它會清除您的所有緩存

CachedNetworkImage 將圖像存儲在臨時(緩存)文件夾中,您可以使用path_providergetTemporaryDirectory()方法訪問它。 在那里您會找到libCachedImageData (您可能需要檢查名稱)。 在那里你可以刪除文件夾。

要在您的應用程序中執行此操作,您應該使用 Directory 類,例如:

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

如果您不想將下載的圖像存儲在緩存中,則不要使用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'),
)

在您的 CachedNetworkImage 中,添加 CacheManager 配置:

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(() {});
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM