improve icon caching for widgets

This commit is contained in:
Fabian Freund
2026-02-01 11:45:11 +01:00
parent 88ae166e52
commit 0dd5710488
3 changed files with 20 additions and 7 deletions
@@ -360,12 +360,14 @@ EquatableValue<List<TabPreview>> filteredTabPreviews(
tabSearchResults.results tabSearchResults.results
.where((tab) => availableTabStates.value.containsKey(tab.id)) .where((tab) => availableTabStates.value.containsKey(tab.id))
.map((tab) { .map((tab) {
final tabState = availableTabStates.value[tab.id]!;
return TabPreview( return TabPreview(
id: tab.id, id: tab.id,
containerId: tab.containerId, containerId: tab.containerId,
title: tab.title ?? availableTabStates.value[tab.id]!.title, title: tab.title ?? tabState.title,
icon: null, icon: tabState.icon,
url: tab.cleanUrl ?? availableTabStates.value[tab.id]!.url, url: tab.cleanUrl ?? tabState.url,
highlightedUrl: tab.url, highlightedUrl: tab.url,
extractedContent: tab.extractedContent, extractedContent: tab.extractedContent,
fullContent: tab.fullContent, fullContent: tab.fullContent,
@@ -763,7 +763,7 @@ final class FilteredTabPreviewsProvider
} }
String _$filteredTabPreviewsHash() => String _$filteredTabPreviewsHash() =>
r'225d67663d70aa0ad2a5544b75bfe7d6125edb58'; r'2327ad86650b3baa6b9339e280abfc7463c72cf9';
final class FilteredTabPreviewsFamily extends $Family final class FilteredTabPreviewsFamily extends $Family
with with
@@ -23,10 +23,12 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:nullability/nullability.dart';
import 'package:weblibre/core/design/app_colors.dart'; import 'package:weblibre/core/design/app_colors.dart';
import 'package:weblibre/core/routing/routes.dart'; import 'package:weblibre/core/routing/routes.dart';
import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart'; import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart';
import 'package:weblibre/features/geckoview/domain/entities/states/readerable.dart'; import 'package:weblibre/features/geckoview/domain/entities/states/readerable.dart';
import 'package:weblibre/features/geckoview/domain/entities/states/tab.dart';
import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart'; import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart';
import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart'; import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart';
import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; import 'package:weblibre/features/geckoview/domain/repositories/tab.dart';
@@ -387,6 +389,7 @@ typedef _QuickTabItem = ({
bool isHistory, bool isHistory,
String title, String title,
Uri url, Uri url,
TabState? tabState,
}); });
class ContextualToolbar extends HookConsumerWidget { class ContextualToolbar extends HookConsumerWidget {
@@ -517,7 +520,13 @@ class QuickTabSwitcher extends HookConsumerWidget {
], ],
); );
}, },
itemAvatar: (item) => UrlIcon([item.url], iconSize: 16), itemAvatar: (item) =>
item.tabState?.icon.mapNotNull(
(icon) => icon.value.mapNotNull(
(image) => RawImage(image: image, height: 24, width: 24),
),
) ??
UrlIcon([item.url], iconSize: 16),
itemBackgroundColor: (item) => itemBackgroundColor: (item) =>
item.color != null ? ContainerColors.forChip(item.color!) : null, item.color != null ? ContainerColors.forChip(item.color!) : null,
onSelected: (item) async { onSelected: (item) async {
@@ -561,7 +570,7 @@ class QuickTabSwitcher extends HookConsumerWidget {
); );
}, },
availableItems: tabStates availableItems: tabStates
.map( .map<_QuickTabItem>(
(state) => ( (state) => (
id: state.$1.id, id: state.$1.id,
title: state.$1.titleOrAuthority, title: state.$1.titleOrAuthority,
@@ -569,10 +578,11 @@ class QuickTabSwitcher extends HookConsumerWidget {
isHistory: false, isHistory: false,
url: state.$1.url, url: state.$1.url,
color: state.$2?.color, color: state.$2?.color,
tabState: state.$1,
), ),
) )
.followedBy( .followedBy(
(historyAsync.data ?? []).map((state) { (historyAsync.data ?? []).map<_QuickTabItem>((state) {
final url = Uri.parse(state.url); final url = Uri.parse(state.url);
return ( return (
@@ -582,6 +592,7 @@ class QuickTabSwitcher extends HookConsumerWidget {
isHistory: true, isHistory: true,
url: url, url: url,
color: null, color: null,
tabState: null,
); );
}), }),
), ),