fix(player): stabilize mobile content strip

This commit is contained in:
edde746
2026-06-08 00:50:22 +02:00
parent 38616770e5
commit 42d9168941
2 changed files with 112 additions and 26 deletions
@@ -124,6 +124,7 @@ class MobileVideoControls extends StatefulWidget {
class _MobileVideoControlsState extends State<MobileVideoControls> with SingleTickerProviderStateMixin {
late final AnimationController _stripAnim;
bool _stripVisible = false;
late bool _lastControlsVisible;
/// Drag distance (in pixels) required to fully reveal the strip.
static const _dragExtent = 150.0;
@@ -136,6 +137,7 @@ class _MobileVideoControlsState extends State<MobileVideoControls> with SingleTi
super.initState();
_stripAnim = AnimationController(vsync: this, duration: const Duration(milliseconds: 250));
_stripAnim.addListener(_onStripAnimChanged);
_lastControlsVisible = widget.chromeController?.controlsVisible ?? true;
widget.chromeController?.addListener(_onChromeVisibilityChanged);
}
@@ -144,6 +146,7 @@ class _MobileVideoControlsState extends State<MobileVideoControls> with SingleTi
super.didUpdateWidget(oldWidget);
if (oldWidget.chromeController != widget.chromeController) {
oldWidget.chromeController?.removeListener(_onChromeVisibilityChanged);
_lastControlsVisible = widget.chromeController?.controlsVisible ?? true;
widget.chromeController?.addListener(_onChromeVisibilityChanged);
}
}
@@ -165,12 +168,16 @@ class _MobileVideoControlsState extends State<MobileVideoControls> with SingleTi
}
void _onChromeVisibilityChanged() {
if (widget.chromeController?.controlsVisible == false && _stripVisible) {
final controlsVisible = widget.chromeController?.controlsVisible ?? true;
final wasControlsVisible = _lastControlsVisible;
_lastControlsVisible = controlsVisible;
if (!controlsVisible && wasControlsVisible && _stripVisible) {
// Just notify parent that strip is no longer active — don't animate,
// let the overlay fade out with the strip still showing.
_stripVisible = false;
widget.onStripVisibilityChanged?.call(false);
} else if (widget.chromeController?.controlsVisible == true && _stripAnim.value > 0) {
} else if (controlsVisible && !wasControlsVisible && _stripAnim.value > 0) {
// Reset strip when controls reappear so page 0 is shown.
_stripAnim.value = 0;
}