fix(player): stabilize mobile content strip
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user