diff --git a/lib/screens/media_detail_screen.dart b/lib/screens/media_detail_screen.dart index 49b9cdf7..88c5f44a 100644 --- a/lib/screens/media_detail_screen.dart +++ b/lib/screens/media_detail_screen.dart @@ -84,7 +84,7 @@ class _MediaDetailScreenState extends State late final ScrollController _scrollController; final ScrollController _extrasScrollController = ScrollController(); bool _watchStateChanged = false; - double _scrollOffset = 0; + final ValueNotifier _scrollOffset = ValueNotifier(0); // Inline season tabs int _selectedSeasonIndex = 0; @@ -348,14 +348,13 @@ class _MediaDetailScreenState extends State } void _onScroll() { - setState(() { - _scrollOffset = _scrollController.offset; - }); + _scrollOffset.value = _scrollController.offset; } @override void dispose() { _scrollController.dispose(); + _scrollOffset.dispose(); _extrasScrollController.dispose(); _extrasFocusNode.dispose(); _playButtonFocusNode.dispose(); @@ -2532,24 +2531,28 @@ class _MediaDetailScreenState extends State top: 0, left: 0, right: 0, - child: IgnorePointer( - ignoring: _scrollOffset < 50, - child: AnimatedOpacity( - opacity: (_scrollOffset / 100).clamp(0.0, 1.0), - duration: const Duration(milliseconds: 150), - child: Container( - height: MediaQuery.of(context).padding.top + 58, - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - Theme.of(context).scaffoldBackgroundColor.withValues(alpha: 0.8), - Theme.of(context).scaffoldBackgroundColor.withValues(alpha: 0.5), - Theme.of(context).scaffoldBackgroundColor.withValues(alpha: 0), - ], - stops: const [0.0, 0.3, 1.0], - ), + child: ValueListenableBuilder( + valueListenable: _scrollOffset, + builder: (context, offset, child) => IgnorePointer( + ignoring: offset < 50, + child: AnimatedOpacity( + opacity: (offset / 100).clamp(0.0, 1.0), + duration: const Duration(milliseconds: 150), + child: child!, + ), + ), + child: Container( + height: MediaQuery.of(context).padding.top + 58, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Theme.of(context).scaffoldBackgroundColor.withValues(alpha: 0.8), + Theme.of(context).scaffoldBackgroundColor.withValues(alpha: 0.5), + Theme.of(context).scaffoldBackgroundColor.withValues(alpha: 0), + ], + stops: const [0.0, 0.3, 1.0], ), ), ), diff --git a/lib/widgets/horizontal_scroll_with_arrows.dart b/lib/widgets/horizontal_scroll_with_arrows.dart index 9da1365f..b443bbf5 100644 --- a/lib/widgets/horizontal_scroll_with_arrows.dart +++ b/lib/widgets/horizontal_scroll_with_arrows.dart @@ -63,10 +63,14 @@ class _HorizontalScrollWithArrowsState extends State } final position = _scrollController.position; - setState(() { - _canScrollLeft = position.pixels > 0; - _canScrollRight = position.pixels < position.maxScrollExtent; - }); + final newLeft = position.pixels > 0; + final newRight = position.pixels < position.maxScrollExtent; + if (newLeft != _canScrollLeft || newRight != _canScrollRight) { + setState(() { + _canScrollLeft = newLeft; + _canScrollRight = newRight; + }); + } } void _animateScroll(double direction) {