improve image caching and disposal
This commit is contained in:
@@ -122,24 +122,24 @@ class TabStates extends _$TabStates {
|
||||
Future<void> _onIconChange(IconChangeEvent event) async {
|
||||
final IconChangeEvent(:tabId, :bytes) = event;
|
||||
|
||||
// Dispose old icon before replacing
|
||||
state[tabId]?.icon?.dispose();
|
||||
|
||||
final image = await bytes.mapNotNull((bytes) => tryDecodeImage(bytes));
|
||||
|
||||
final current = state[tabId] ?? TabState.$default(tabId);
|
||||
|
||||
// Dispose old icon only after successfully creating new one
|
||||
current.icon?.dispose();
|
||||
|
||||
state = {...state}..[tabId] = current.copyWith.icon(image);
|
||||
}
|
||||
|
||||
Future<void> _onThumbnailChange(ThumbnailEvent event) async {
|
||||
final ThumbnailEvent(:tabId, :bytes) = event;
|
||||
|
||||
// Dispose old thumbnail before replacing
|
||||
state[tabId]?.thumbnail?.dispose();
|
||||
|
||||
final image = await bytes.mapNotNull((bytes) => tryDecodeImage(bytes));
|
||||
|
||||
final current = state[tabId] ?? TabState.$default(tabId);
|
||||
|
||||
// Dispose old thumbnail only after successfully creating new one
|
||||
current.thumbnail?.dispose();
|
||||
|
||||
state = {...state}..[tabId] = current.copyWith.thumbnail(image);
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ final class TabStatesProvider
|
||||
}
|
||||
}
|
||||
|
||||
String _$tabStatesHash() => r'f2e6920017b3f46944d85254c09c54779eb89eb3';
|
||||
String _$tabStatesHash() => r'67b497304b4137ce0115a66f06f3622c86e5727d';
|
||||
|
||||
abstract class _$TabStates extends $Notifier<Map<String, TabState>> {
|
||||
Map<String, TabState> build();
|
||||
|
||||
@@ -27,22 +27,31 @@ import 'package:weblibre/domain/entities/equatable_image.dart';
|
||||
import 'package:weblibre/features/geckoview/domain/entities/states/web_extension.dart';
|
||||
import 'package:weblibre/features/geckoview/domain/providers.dart';
|
||||
import 'package:weblibre/features/geckoview/utils/image_helper.dart';
|
||||
import 'package:weblibre/utils/lru_cache.dart';
|
||||
|
||||
part 'web_extensions_state.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
class WebExtensionsState extends _$WebExtensionsState {
|
||||
final _imageCache = <String, EquatableImage>{};
|
||||
late final LRUCache<String, EquatableImage> _imageCache;
|
||||
|
||||
WebExtensionsState()
|
||||
: _imageCache = LRUCache(50, onEvict: (image) => image.dispose());
|
||||
|
||||
void _onExtensionUpdate(ExtensionDataEvent event) {
|
||||
final ExtensionDataEvent(:extensionId, :data) = event;
|
||||
|
||||
if (data != null) {
|
||||
final cachedIcon = _imageCache.get(extensionId);
|
||||
if (cachedIcon != null && cachedIcon.value == null) {
|
||||
_imageCache.remove(extensionId);
|
||||
}
|
||||
|
||||
final current =
|
||||
state[extensionId] ??
|
||||
WebExtensionState(
|
||||
extensionId: extensionId,
|
||||
icon: _imageCache[extensionId],
|
||||
icon: _imageCache.get(extensionId),
|
||||
enabled: false,
|
||||
);
|
||||
|
||||
@@ -73,10 +82,10 @@ class WebExtensionsState extends _$WebExtensionsState {
|
||||
final image = await tryDecodeImage(bytes);
|
||||
|
||||
if (image != null) {
|
||||
// Dispose old image before replacing
|
||||
_imageCache[extensionId]?.dispose();
|
||||
// Dispose old image only after successfully creating new one
|
||||
_imageCache.get(extensionId)?.dispose();
|
||||
|
||||
_imageCache[extensionId] = image;
|
||||
_imageCache.set(extensionId, image);
|
||||
|
||||
if (state.containsKey(extensionId)) {
|
||||
state = {...state}
|
||||
@@ -110,9 +119,6 @@ class WebExtensionsState extends _$WebExtensionsState {
|
||||
|
||||
ref.onDispose(() async {
|
||||
// Dispose all cached images
|
||||
for (final image in _imageCache.values) {
|
||||
image.dispose();
|
||||
}
|
||||
_imageCache.clear();
|
||||
|
||||
// Cancel all stream subscriptions
|
||||
|
||||
@@ -62,7 +62,7 @@ final class WebExtensionsStateProvider
|
||||
}
|
||||
|
||||
String _$webExtensionsStateHash() =>
|
||||
r'd7147f419889386f8cf526aed3318839ac22d893';
|
||||
r'2664a50bb776197010e9da9b4e3a9379c849ba75';
|
||||
|
||||
final class WebExtensionsStateFamily extends $Family
|
||||
with
|
||||
|
||||
Reference in New Issue
Block a user