fetchImage method
Implementation
Future<Image> fetchImage(String url) async {
if (taskManager.imageCache.containsKey(url)) {
logger?.i("$url get from memory cache");
return Image.memory(taskManager.imageCache[url]!);
}
final cacheData = diskCache.get(url);
if (cacheData != null) {
logger?.i("$url get from disk cache");
taskManager.imageCache[url] = cacheData;
return Image.memory(cacheData);
}
if (taskManager.fetchingImages.containsKey(url)) {
logger?.i("$url is currently being fetched");
return await taskManager.fetchingImages[url]!;
}
CancelToken cancelToken = CancelToken();
final future = (() async {
try {
final response = await dio.get(
url,
cancelToken: cancelToken,
options: Options(responseType: ResponseType.bytes),
);
if (response.statusCode != 200) {
throw Exception('Failed to load image: ${response.statusCode}');
}
final Uint8List bytes = response.data;
taskManager.imageCache[url] = bytes;
diskCache.save(url, bytes);
return Image.memory(bytes);
} catch (e) {
return errorImage;
} finally {
taskManager.fetchingImages.remove(url);
}
})();
taskManager.fetchingImages[url] = future;
taskManager.runningUrlQueue
.add(EzRunningTaskPair(url: url, cancelToken: cancelToken));
taskManager.manageRunningTasks();
return await future;
}