From f2339bd9d357668723af6624e80d5c6e3095ac85 Mon Sep 17 00:00:00 2001 From: Lars <129963861+Raasu258@users.noreply.github.com> Date: Mon, 31 Aug 2026 22:32:51 +0200 Subject: [PATCH] fix: prevent transient bottom overflow from mini-player animation SlidingUpPanel animates its own height between minHeight and maxHeight (full screen) while opening/closing. Since it sits as a plain child in the Scaffold's footers column, that transient height briefly exceeds the fixed collapsed slot it was given, overflowing the footers column by ~18-24px during the animation. Wrap it in a fixed-size SizedBox + OverflowBox so the panel can still paint at its actual (larger) size while reporting only the collapsed height to its parent, avoiding the layout overflow. --- lib/modules/player/player_overlay.dart | 59 +++++++++++++++++--------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/lib/modules/player/player_overlay.dart b/lib/modules/player/player_overlay.dart index 3c3ff373..3fd91bca 100644 --- a/lib/modules/player/player_overlay.dart +++ b/lib/modules/player/player_overlay.dart @@ -28,26 +28,45 @@ class PlayerOverlay extends HookConsumerWidget { final panelController = ref.watch(playerOverlayControllerProvider); - return SlidingUpPanel( - maxHeight: screenSize.height, - backdropEnabled: false, - minHeight: canShow ? 63 : 0, - onPanelSlide: (position) { - final invertedPosition = 1 - position; - ref.read(navigationPanelHeight.notifier).state = 50 * invertedPosition; - }, - controller: panelController, - color: Colors.transparent, - parallaxEnabled: true, - renderPanelSheet: false, - header: SizedBox( - height: 63, - width: screenSize.width, - child: PlayerOverlayCollapsedSection(panelController: panelController), - ), - panelBuilder: (scrollController) => PlayerView( - panelController: panelController, - scrollController: scrollController, + // [SlidingUpPanel] animates its own height between [minHeight] and + // [maxHeight] (the full screen height) while it is being opened/closed. + // Since this widget sits as a plain child inside the [Scaffold]'s + // footers column, that transient height briefly exceeds the collapsed + // [minHeight] slot it was given, overflowing the footers column by a + // few pixels. [OverflowBox] lets the panel keep painting at its actual + // (larger) size while reporting only the fixed collapsed height to its + // parent, so the outer layout never overflows. + return SizedBox( + height: canShow ? 63 : 0, + width: screenSize.width, + child: OverflowBox( + maxHeight: screenSize.height, + alignment: Alignment.bottomCenter, + child: SlidingUpPanel( + maxHeight: screenSize.height, + backdropEnabled: false, + minHeight: canShow ? 63 : 0, + onPanelSlide: (position) { + final invertedPosition = 1 - position; + ref.read(navigationPanelHeight.notifier).state = + 50 * invertedPosition; + }, + controller: panelController, + color: Colors.transparent, + parallaxEnabled: true, + renderPanelSheet: false, + header: SizedBox( + height: 63, + width: screenSize.width, + child: PlayerOverlayCollapsedSection( + panelController: panelController, + ), + ), + panelBuilder: (scrollController) => PlayerView( + panelController: panelController, + scrollController: scrollController, + ), + ), ), ); }