From 25acfe904796dfa62f03df92f1e814d658072c09 Mon Sep 17 00:00:00 2001 From: Tommy Chow Date: Sat, 23 Aug 2025 00:13:50 -0700 Subject: [PATCH] fix scroll controller errors --- .../home/stream_list/streams_list.dart | 38 +++++++++++-------- lib/widgets/animated_scroll_border.dart | 15 +++++++- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/lib/screens/home/stream_list/streams_list.dart b/lib/screens/home/stream_list/streams_list.dart index 91e1c1c1..27357ee7 100644 --- a/lib/screens/home/stream_list/streams_list.dart +++ b/lib/screens/home/stream_list/streams_list.dart @@ -42,15 +42,8 @@ class StreamsList extends StatefulWidget { class _StreamsListState extends State with AutomaticKeepAliveClientMixin, WidgetsBindingObserver { - late final _listStore = ListStore( - authStore: context.read(), - settingsStore: context.read(), - twitchApi: context.read(), - listType: widget.listType, - categoryId: widget.categoryId, - scrollController: widget.scrollController ?? - (widget.showJumpButton ? ScrollController() : null), - ); + late final ListStore _listStore; + ScrollController? _scrollController; @override bool get wantKeepAlive => true; @@ -59,6 +52,26 @@ class _StreamsListState extends State void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); + + if (widget.scrollController == null && widget.showJumpButton) { + _scrollController = ScrollController(); + } + + _listStore = ListStore( + authStore: context.read(), + settingsStore: context.read(), + twitchApi: context.read(), + listType: widget.listType, + categoryId: widget.categoryId, + scrollController: widget.scrollController ?? _scrollController, + ); + } + + @override + void dispose() { + _scrollController?.dispose(); + WidgetsBinding.instance.removeObserver(this); + super.dispose(); } @override @@ -288,11 +301,4 @@ class _StreamsListState extends State ), ); } - - @override - void dispose() { - WidgetsBinding.instance.removeObserver(this); - _listStore.dispose(); - super.dispose(); - } } diff --git a/lib/widgets/animated_scroll_border.dart b/lib/widgets/animated_scroll_border.dart index 5089aacc..2e8cb4e9 100644 --- a/lib/widgets/animated_scroll_border.dart +++ b/lib/widgets/animated_scroll_border.dart @@ -19,6 +19,17 @@ class _AnimatedScrollBorderState extends State { void initState() { super.initState(); widget.scrollController.addListener(_updateScrollState); + _updateScrollState(); // Initial check + } + + @override + void didUpdateWidget(AnimatedScrollBorder oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.scrollController != oldWidget.scrollController) { + oldWidget.scrollController.removeListener(_updateScrollState); + widget.scrollController.addListener(_updateScrollState); + _updateScrollState(); // Initial check for new controller + } } @override @@ -28,8 +39,10 @@ class _AnimatedScrollBorderState extends State { } void _updateScrollState() { + if (!mounted) return; setState(() { - _isScrolled = widget.scrollController.offset > 0; + _isScrolled = widget.scrollController.hasClients && + widget.scrollController.offset > 0; }); }