diff --git a/lib/screens/local_album_screen.dart b/lib/screens/local_album_screen.dart index 5dd403e5..7c7f345d 100644 --- a/lib/screens/local_album_screen.dart +++ b/lib/screens/local_album_screen.dart @@ -34,12 +34,39 @@ class _LocalAlbumScreenState extends ConsumerState { Color? _dominantColor; bool _showTitleInAppBar = false; final ScrollController _scrollController = ScrollController(); + late List _sortedTracksCache; + late Map> _discGroupsCache; + late List _sortedDiscNumbersCache; + late bool _hasMultipleDiscsCache; @override void initState() { super.initState(); _scrollController.addListener(_onScroll); - _extractDominantColor(); + _rebuildTrackCaches(); + final cachedColor = PaletteService.instance.getCached(widget.coverPath); + if (cachedColor != null) { + _dominantColor = cachedColor; + } + WidgetsBinding.instance.addPostFrameCallback((_) { + _extractDominantColor(); + }); + } + + @override + void didUpdateWidget(covariant LocalAlbumScreen oldWidget) { + super.didUpdateWidget(oldWidget); + if (!identical(oldWidget.tracks, widget.tracks) || + oldWidget.tracks.length != widget.tracks.length) { + _rebuildTrackCaches(); + } + if (oldWidget.coverPath != widget.coverPath) { + final cachedColor = PaletteService.instance.getCached(widget.coverPath); + if (cachedColor != null && cachedColor != _dominantColor) { + _dominantColor = cachedColor; + } + _extractDominantColor(); + } } @override @@ -68,7 +95,7 @@ class _LocalAlbumScreenState extends ConsumerState { } } - List get _sortedTracks { + List _buildSortedTracks() { final tracks = List.from(widget.tracks); tracks.sort((a, b) { // Sort by disc number first, then by track number @@ -83,6 +110,13 @@ class _LocalAlbumScreenState extends ConsumerState { return tracks; } + void _rebuildTrackCaches() { + _sortedTracksCache = _buildSortedTracks(); + _discGroupsCache = _groupTracksByDisc(_sortedTracksCache); + _sortedDiscNumbersCache = _discGroupsCache.keys.toList()..sort(); + _hasMultipleDiscsCache = _discGroupsCache.length > 1; + } + Map> _groupTracksByDisc(List tracks) { final discMap = >{}; for (final track in tracks) { @@ -200,7 +234,7 @@ class _LocalAlbumScreenState extends ConsumerState { Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; final bottomPadding = MediaQuery.of(context).padding.bottom; - final tracks = _sortedTracks; + final tracks = _sortedTracksCache; // Show empty state if no tracks found if (tracks.isEmpty) { @@ -489,13 +523,12 @@ class _LocalAlbumScreenState extends ConsumerState { } Widget _buildTrackList(BuildContext context, ColorScheme colorScheme, List tracks) { - final discGroups = _groupTracksByDisc(tracks); - final hasMultipleDiscs = discGroups.length > 1; + final discGroups = _discGroupsCache; + final hasMultipleDiscs = _hasMultipleDiscsCache; final slivers = []; - final sortedDiscNumbers = discGroups.keys.toList()..sort(); - for (final discNumber in sortedDiscNumbers) { + for (final discNumber in _sortedDiscNumbersCache) { final discTracks = discGroups[discNumber]!; if (hasMultipleDiscs) {