mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-07-31 16:27:24 +02:00
perf(library): lazy-load collections and dispose queries
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user