import 'dart:async' show Future, StreamController; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:venera/foundation/local.dart'; import 'package:venera/network/images.dart'; import '../history.dart'; import 'base_image_provider.dart'; import 'history_image_provider.dart' as image_provider; class HistoryImageProvider extends BaseImageProvider { /// Image provider for normal image. /// /// [url] is the url of the image. Local file path is also supported. const HistoryImageProvider(this.history); final History history; @override Future load(StreamController chunkEvents) async { var url = history.cover; if (!url.contains('/')) { var localComic = LocalManager().find(history.id, history.type); if (localComic != null) { return localComic.coverFile.readAsBytes(); } var comicSource = history.type.comicSource ?? (throw "Comic source not found."); var comic = await comicSource.loadComicInfo!(history.id); url = comic.data.cover; history.cover = url; HistoryManager().addHistory(history); } await for (var progress in ImageDownloader.loadThumbnail( url, history.type.sourceKey, history.id, )) { chunkEvents.add(ImageChunkEvent( cumulativeBytesLoaded: progress.currentBytes, expectedTotalBytes: progress.totalBytes, )); if (progress.imageBytes != null) { return progress.imageBytes!; } } throw "Error: Empty response body."; } @override Future obtainKey(ImageConfiguration configuration) { return SynchronousFuture(this); } @override String get key => "history${history.id}${history.type.value}"; }