perf(library): lazy-load collections and dispose queries

This commit is contained in:
zarzet
2026-07-15 21:32:43 +07:00
parent 7f1c3e60db
commit 17dbcc1338
11 changed files with 217 additions and 85 deletions
@@ -58,6 +58,19 @@ class _LibraryTracksFolderScreenState
CollapsingHeaderScrollMixin<LibraryTracksFolderScreen> {
UserPlaylistCollection? playlist;
@override
void initState() {
super.initState();
final playlistId = widget.playlistId;
if (widget.mode == LibraryTracksFolderMode.playlist && playlistId != null) {
Future.microtask(
() => ref
.read(libraryCollectionsProvider.notifier)
.ensurePlaylistLoaded(playlistId),
);
}
}
IconData _modeIcon() {
return switch (widget.mode) {
LibraryTracksFolderMode.wishlist => Icons.bookmark,
+2 -3
View File
@@ -482,7 +482,7 @@ extension _QueueTabCollectionItemWidgets on _QueueTabState {
colorScheme,
),
title: playlist.name,
count: playlist.tracks.length,
count: playlist.trackCount,
onTap: _isPlaylistSelectionMode
? () => _togglePlaylistSelection(playlist.id)
: () => _openPlaylistById(playlist.id),
@@ -630,7 +630,7 @@ extension _QueueTabCollectionItemWidgets on _QueueTabState {
),
title: playlist.name,
subtitle:
'${playlist.tracks.length} ${playlist.tracks.length == 1 ? 'track' : 'tracks'}',
'${playlist.trackCount} ${playlist.trackCount == 1 ? 'track' : 'tracks'}',
onTap: _isPlaylistSelectionMode
? () => _togglePlaylistSelection(playlist.id)
: () => _openPlaylistById(playlist.id),
@@ -646,5 +646,4 @@ extension _QueueTabCollectionItemWidgets on _QueueTabState {
);
}
}
}
+4 -4
View File
@@ -262,8 +262,8 @@ class _QueueLibraryPageData {
}
}
final _queueLibraryPageProvider =
FutureProvider.family<_QueueLibraryPageData, _QueueLibraryPageRequest>((
final _queueLibraryPageProvider = FutureProvider.autoDispose
.family<_QueueLibraryPageData, _QueueLibraryPageRequest>((
ref,
request,
) async {
@@ -338,8 +338,8 @@ final _queueLibraryPageProvider =
);
});
final _queueLibraryCountsProvider =
FutureProvider.family<QueueLibraryCounts, _QueueLibraryCountsRequest>((
final _queueLibraryCountsProvider = FutureProvider.autoDispose
.family<QueueLibraryCounts, _QueueLibraryCountsRequest>((
ref,
request,
) async {
+8 -4
View File
@@ -382,10 +382,14 @@ extension _QueueTabNavigation on _QueueTabState {
);
}
final firstCoverUrl = playlist.tracks
.where((e) => e.track.coverUrl != null && e.track.coverUrl!.isNotEmpty)
.map((e) => e.track.coverUrl!)
.firstOrNull;
final firstCoverUrl =
playlist.tracks
.where(
(e) => e.track.coverUrl != null && e.track.coverUrl!.isNotEmpty,
)
.map((e) => e.track.coverUrl!)
.firstOrNull ??
playlist.previewCover;
if (firstCoverUrl != null) {
// Guard against local file paths that may have been stored as coverUrl
+14 -2
View File
@@ -189,13 +189,13 @@ extension _QueueTabSelectionActions on _QueueTabState {
Future<void> _downloadAllSelectedPlaylists(BuildContext context) async {
final collectionsState = ref.read(libraryCollectionsProvider);
final selectedPlaylists = collectionsState.playlists
var selectedPlaylists = collectionsState.playlists
.where((p) => _selectedPlaylistIds.contains(p.id))
.toList();
final totalTracks = selectedPlaylists.fold<int>(
0,
(sum, p) => sum + p.tracks.length,
(sum, p) => sum + p.trackCount,
);
if (totalTracks == 0) {
@@ -230,6 +230,18 @@ extension _QueueTabSelectionActions on _QueueTabState {
if (confirmed != true || !context.mounted) return;
await ref
.read(libraryCollectionsProvider.notifier)
.ensurePlaylistsLoaded(
selectedPlaylists.map((playlist) => playlist.id),
);
if (!context.mounted) return;
selectedPlaylists = ref
.read(libraryCollectionsProvider)
.playlists
.where((playlist) => _selectedPlaylistIds.contains(playlist.id))
.toList(growable: false);
final settings = ref.read(settingsProvider);
final extensionState = ref.read(extensionProvider);
final queueNotifier = ref.read(downloadQueueProvider.notifier);