2ebe6229b7
Two related "snap in" effects on the now-playing screen: 1. **Album art snapped in after the fade.** AnimatedSwitcher cross- fades the new _AlbumArt over 300ms, but FileImage's bytes weren't decoded yet — the widget was visually empty during the fade and the cover landed abruptly after. precacheImage on the new file:// artUri pre-decodes the bytes so by the time AnimatedSwitcher mounts the new tile, the cover paints synchronously inside it. The cross-fade now carries real content end-to-end. 2. **Backdrop color snapped in.** albumColorProvider.family is loading for the new id during the track-change moment, so dominant fell back to fs.obsidian; AnimatedContainer tweened to obsidian and then snapped to the resolved color a beat later. _NowPlayingScreenState now holds _lastDominant across builds: while extraction for the new id is loading, the gradient stays on the previous album's color, then animates straight to the new one once it resolves. No intermediate obsidian stop. Net effect: track changes feel like a single smooth transition instead of fade-out → blank → snap.