From 57b2f48c729613658207665bbc762ffe19122fa3 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Fri, 22 Nov 2024 18:50:07 +0800 Subject: [PATCH] opt: ctr Signed-off-by: bggRGjQaUbCoE --- lib/pages/dynamics/controller.dart | 7 ++ lib/pages/dynamics/detail/view.dart | 98 ++++++++++--------- lib/pages/dynamics/view.dart | 2 - lib/pages/emote/view.dart | 18 ++-- lib/pages/history/controller.dart | 6 ++ lib/pages/history/view.dart | 12 +-- lib/pages/home/controller.dart | 1 + lib/pages/member_archive/controller.dart | 6 ++ lib/pages/member_archive/view.dart | 1 - lib/pages/member_search/controller.dart | 7 ++ lib/pages/member_search/view.dart | 14 +-- lib/pages/member_seasons/controller.dart | 6 ++ lib/pages/member_seasons/view.dart | 1 - lib/pages/rank/controller.dart | 6 ++ lib/pages/rank/view.dart | 6 -- lib/pages/search/controller.dart | 6 ++ lib/pages/search/view.dart | 1 - lib/pages/subscription/controller.dart | 6 ++ lib/pages/subscription/view.dart | 1 - .../detail/introduction/widgets/page.dart | 10 +- lib/pages/whisper_detail/controller.dart | 6 ++ lib/pages/whisper_detail/view.dart | 1 - 22 files changed, 134 insertions(+), 88 deletions(-) diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart index eecbb221..1ef011ac 100644 --- a/lib/pages/dynamics/controller.dart +++ b/lib/pages/dynamics/controller.dart @@ -318,4 +318,11 @@ class DynamicsController extends GetxController .animateToTop(); scrollController.animToTop(); } + + @override + void onClose() { + tabController.dispose(); + scrollController.dispose(); + super.onClose(); + } } diff --git a/lib/pages/dynamics/detail/view.dart b/lib/pages/dynamics/detail/view.dart index 482e5ff3..f3eb2804 100644 --- a/lib/pages/dynamics/detail/view.dart +++ b/lib/pages/dynamics/detail/view.dart @@ -32,9 +32,8 @@ class DynamicDetailPage extends StatefulWidget { class _DynamicDetailPageState extends State with TickerProviderStateMixin { late DynamicDetailController _dynamicDetailController; - late AnimationController fabAnimationCtr; - late StreamController titleStreamC; // appBar title - late ScrollController scrollController; + AnimationController? _fabAnimationCtr; + late StreamController _titleStreamC; // appBar title bool _visibleTitle = false; String? action; // 回复类型 @@ -49,17 +48,17 @@ class _DynamicDetailPageState extends State super.initState(); // floor 1原创 2转发 init(); - titleStreamC = StreamController(); + _titleStreamC = StreamController(); if (action == 'comment') { _visibleTitle = true; - titleStreamC.add(true); + _titleStreamC.add(true); } - fabAnimationCtr = AnimationController( + _fabAnimationCtr = AnimationController( vsync: this, duration: const Duration(milliseconds: 300), ); - fabAnimationCtr.forward(); + _fabAnimationCtr?.forward(); // 滚动事件监听 scrollListener(); } @@ -127,29 +126,31 @@ class _DynamicDetailPageState extends State // 滑动事件监听 void scrollListener() { - scrollController = _dynamicDetailController.scrollController; - scrollController.addListener( + _dynamicDetailController.scrollController.addListener( () { // 分页加载 - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 300) { + if (_dynamicDetailController.scrollController.position.pixels >= + _dynamicDetailController.scrollController.position.maxScrollExtent - + 300) { EasyThrottle.throttle('replylist', const Duration(seconds: 2), () { _dynamicDetailController.onLoadMore(); }); } // 标题 - if (scrollController.offset > 55 && !_visibleTitle) { + if (_dynamicDetailController.scrollController.offset > 55 && + !_visibleTitle) { _visibleTitle = true; - titleStreamC.add(true); - } else if (scrollController.offset <= 55 && _visibleTitle) { + _titleStreamC.add(true); + } else if (_dynamicDetailController.scrollController.offset <= 55 && + _visibleTitle) { _visibleTitle = false; - titleStreamC.add(false); + _titleStreamC.add(false); } // fab按钮 - final ScrollDirection direction = - scrollController.position.userScrollDirection; + final ScrollDirection direction = _dynamicDetailController + .scrollController.position.userScrollDirection; if (direction == ScrollDirection.forward) { _showFab(); } else if (direction == ScrollDirection.reverse) { @@ -162,22 +163,23 @@ class _DynamicDetailPageState extends State void _showFab() { if (!_isFabVisible) { _isFabVisible = true; - fabAnimationCtr.forward(); + _fabAnimationCtr?.forward(); } } void _hideFab() { if (_isFabVisible) { _isFabVisible = false; - fabAnimationCtr.reverse(); + _fabAnimationCtr?.reverse(); } } @override void dispose() { - titleStreamC.close(); - fabAnimationCtr.dispose(); - scrollController.removeListener(() {}); + _titleStreamC.close(); + _fabAnimationCtr?.dispose(); + _fabAnimationCtr = null; + _dynamicDetailController.scrollController.removeListener(() {}); super.dispose(); } @@ -186,7 +188,7 @@ class _DynamicDetailPageState extends State return Scaffold( appBar: AppBar( title: StreamBuilder( - stream: titleStreamC.stream, + stream: _titleStreamC.stream, initialData: false, builder: (context, AsyncSnapshot snapshot) { return AnimatedOpacity( @@ -212,7 +214,7 @@ class _DynamicDetailPageState extends State double padding = max(context.width / 2 - Grid.maxRowWidth, 0); if (orientation == Orientation.portrait) { return CustomScrollView( - controller: scrollController, + controller: _dynamicDetailController.scrollController, physics: const AlwaysScrollableScrollPhysics(), slivers: [ SliverToBoxAdapter( @@ -252,7 +254,8 @@ class _DynamicDetailPageState extends State ), Expanded( child: CustomScrollView( - controller: scrollController, + controller: + _dynamicDetailController.scrollController, physics: const AlwaysScrollableScrollPhysics(), slivers: [ SliverPadding( @@ -276,30 +279,31 @@ class _DynamicDetailPageState extends State } }, ), - Positioned( - bottom: MediaQuery.of(context).padding.bottom + 14, - right: 14, - child: SlideTransition( - position: Tween( - begin: const Offset(0, 2), - end: const Offset(0, 0), - ).animate(CurvedAnimation( - parent: fabAnimationCtr, - curve: Curves.easeInOut, - )), - child: FloatingActionButton( - heroTag: null, - onPressed: () { - feedBack(); - dynamic oid = _dynamicDetailController.oid ?? - IdUtils.bv2av(Get.parameters['bvid']!); - _dynamicDetailController.onReply(context, oid: oid); - }, - tooltip: '评论动态', - child: const Icon(Icons.reply), + if (_fabAnimationCtr != null) + Positioned( + bottom: MediaQuery.of(context).padding.bottom + 14, + right: 14, + child: SlideTransition( + position: Tween( + begin: const Offset(0, 2), + end: const Offset(0, 0), + ).animate(CurvedAnimation( + parent: _fabAnimationCtr!, + curve: Curves.easeInOut, + )), + child: FloatingActionButton( + heroTag: null, + onPressed: () { + feedBack(); + dynamic oid = _dynamicDetailController.oid ?? + IdUtils.bv2av(Get.parameters['bvid']!); + _dynamicDetailController.onReply(context, oid: oid); + }, + tooltip: '评论动态', + child: const Icon(Icons.reply), + ), ), ), - ), ], ), ), diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart index 173d0579..e969b3ff 100644 --- a/lib/pages/dynamics/view.dart +++ b/lib/pages/dynamics/view.dart @@ -118,9 +118,7 @@ class _DynamicsPageState extends State @override void dispose() { _dynamicsController.tabController.removeListener(() {}); - _dynamicsController.tabController.dispose(); _dynamicsController.scrollController.removeListener(() {}); - _dynamicsController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/emote/view.dart b/lib/pages/emote/view.dart index 3a20ee4e..f701d53d 100644 --- a/lib/pages/emote/view.dart +++ b/lib/pages/emote/view.dart @@ -114,14 +114,18 @@ class _EmotePanelState extends State SizedBox(height: MediaQuery.of(context).padding.bottom), ], ) - : errorWidget( - callback: _emotePanelController.onReload, - ), - Error() => errorWidget( - errMsg: loadingState.errMsg, - callback: _emotePanelController.onReload, - ), + : _errorWidget, + Error() => _errorWidget, LoadingState() => throw UnimplementedError(), }; } + + Widget get _errorWidget => Center( + child: IconButton( + onPressed: () { + _emotePanelController.onReload(); + }, + icon: Icon(Icons.refresh), + ), + ); } diff --git a/lib/pages/history/controller.dart b/lib/pages/history/controller.dart index 5870ba59..6d6e660e 100644 --- a/lib/pages/history/controller.dart +++ b/lib/pages/history/controller.dart @@ -205,4 +205,10 @@ class HistoryController extends GetxController { }, ); } + + @override + void onClose() { + scrollController.dispose(); + super.onClose(); + } } diff --git a/lib/pages/history/view.dart b/lib/pages/history/view.dart index 7651474d..bd8a1f3c 100644 --- a/lib/pages/history/view.dart +++ b/lib/pages/history/view.dart @@ -21,17 +21,16 @@ class HistoryPage extends StatefulWidget { class _HistoryPageState extends State { final HistoryController _historyController = Get.put(HistoryController()); Future? _futureBuilderFuture; - late ScrollController scrollController; @override void initState() { super.initState(); _futureBuilderFuture = _historyController.queryHistoryList(); - scrollController = _historyController.scrollController; - scrollController.addListener( + _historyController.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 300) { + if (_historyController.scrollController.position.pixels >= + _historyController.scrollController.position.maxScrollExtent - + 300) { if (!_historyController.isLoadingMore.value) { EasyThrottle.throttle('history', const Duration(seconds: 1), () { _historyController.onLoad(); @@ -61,8 +60,7 @@ class _HistoryPageState extends State { @override void dispose() { - scrollController.removeListener(() {}); - scrollController.dispose(); + _historyController.scrollController.removeListener(() {}); super.dispose(); } diff --git a/lib/pages/home/controller.dart b/lib/pages/home/controller.dart index 101669e0..68dcd896 100644 --- a/lib/pages/home/controller.dart +++ b/lib/pages/home/controller.dart @@ -99,6 +99,7 @@ class HomeController extends GetxController with GetTickerProviderStateMixin { @override void dispose() { tabController.animation!.removeListener(() {}); + tabController.dispose(); super.dispose(); } diff --git a/lib/pages/member_archive/controller.dart b/lib/pages/member_archive/controller.dart index 4a7a13af..cc7f0e42 100644 --- a/lib/pages/member_archive/controller.dart +++ b/lib/pages/member_archive/controller.dart @@ -64,4 +64,10 @@ class MemberArchiveController extends GetxController { Future onLoad() async { getMemberArchive('onLoad'); } + + @override + void onClose() { + scrollController.dispose(); + super.onClose(); + } } diff --git a/lib/pages/member_archive/view.dart b/lib/pages/member_archive/view.dart index 20b92fad..ad4f4b58 100644 --- a/lib/pages/member_archive/view.dart +++ b/lib/pages/member_archive/view.dart @@ -23,7 +23,6 @@ class _MemberArchivePageState extends State { @override void dispose() { _memberArchivesController.scrollController.removeListener(() {}); - _memberArchivesController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/member_search/controller.dart b/lib/pages/member_search/controller.dart index b54f289a..69313a14 100644 --- a/lib/pages/member_search/controller.dart +++ b/lib/pages/member_search/controller.dart @@ -90,4 +90,11 @@ class MemberSearchController extends GetxController { onLoad() { searchArchives(type: 'onLoad'); } + + @override + void onClose() { + searchFocusNode.dispose(); + scrollController.dispose(); + super.onClose(); + } } diff --git a/lib/pages/member_search/view.dart b/lib/pages/member_search/view.dart index 18913a4b..ff208d33 100644 --- a/lib/pages/member_search/view.dart +++ b/lib/pages/member_search/view.dart @@ -20,16 +20,14 @@ class _MemberSearchPageState extends State with SingleTickerProviderStateMixin { final MemberSearchController _memberSearchCtr = Get.put(MemberSearchController()); - late ScrollController scrollController; @override void initState() { super.initState(); - scrollController = _memberSearchCtr.scrollController; - scrollController.addListener( + _memberSearchCtr.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 300) { + if (_memberSearchCtr.scrollController.position.pixels >= + _memberSearchCtr.scrollController.position.maxScrollExtent - 300) { EasyThrottle.throttle('history', const Duration(seconds: 1), () { _memberSearchCtr.onLoad(); }); @@ -42,9 +40,7 @@ class _MemberSearchPageState extends State @override void dispose() { // _tabController.dispose(); - _memberSearchCtr.searchFocusNode.dispose(); - scrollController.removeListener(() {}); - scrollController.dispose(); + _memberSearchCtr.scrollController.removeListener(() {}); super.dispose(); } @@ -94,7 +90,7 @@ class _MemberSearchPageState extends State } return CustomScrollView( physics: const AlwaysScrollableScrollPhysics(), - controller: scrollController, + controller: _memberSearchCtr.scrollController, slivers: [ FutureBuilder( future: _memberSearchCtr.searchArchives(), diff --git a/lib/pages/member_seasons/controller.dart b/lib/pages/member_seasons/controller.dart index 57315a79..8825e6bd 100644 --- a/lib/pages/member_seasons/controller.dart +++ b/lib/pages/member_seasons/controller.dart @@ -44,4 +44,10 @@ class MemberSeasonsController extends GetxController { Future onLoad() async { getSeasonDetail('onLoad'); } + + @override + void onClose() { + scrollController.dispose(); + super.onClose(); + } } diff --git a/lib/pages/member_seasons/view.dart b/lib/pages/member_seasons/view.dart index d9373fb8..b05bfb6c 100644 --- a/lib/pages/member_seasons/view.dart +++ b/lib/pages/member_seasons/view.dart @@ -21,7 +21,6 @@ class _MemberSeasonsPageState extends State { @override void dispose() { _memberSeasonsController.scrollController.removeListener(() {}); - _memberSeasonsController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/rank/controller.dart b/lib/pages/rank/controller.dart index 7d7753fc..395255cb 100644 --- a/lib/pages/rank/controller.dart +++ b/lib/pages/rank/controller.dart @@ -64,4 +64,10 @@ class RankController extends GetxController with GetTickerProviderStateMixin { // }); // } } + + @override + void onClose() { + tabController.dispose(); + super.onClose(); + } } diff --git a/lib/pages/rank/view.dart b/lib/pages/rank/view.dart index 8d600376..34435896 100644 --- a/lib/pages/rank/view.dart +++ b/lib/pages/rank/view.dart @@ -23,12 +23,6 @@ class _RankPageState extends State TabController(vsync: this, length: _rankController.tabs.length); } - @override - void dispose() { - _rankController.tabController.dispose(); - super.dispose(); - } - @override Widget build(BuildContext context) { super.build(context); diff --git a/lib/pages/search/controller.dart b/lib/pages/search/controller.dart index cfee8bbf..c9533de9 100644 --- a/lib/pages/search/controller.dart +++ b/lib/pages/search/controller.dart @@ -130,4 +130,10 @@ class SSearchController extends GetxController { historyList.refresh(); historyWord.put('cacheList', []); } + + @override + void onClose() { + searchFocusNode.dispose(); + super.onClose(); + } } diff --git a/lib/pages/search/view.dart b/lib/pages/search/view.dart index c5ab6283..fd984667 100644 --- a/lib/pages/search/view.dart +++ b/lib/pages/search/view.dart @@ -26,7 +26,6 @@ class _SearchPageState extends State with RouteAware { @override void dispose() { - _searchController.searchFocusNode.dispose(); SearchPage.routeObserver.unsubscribe(this); super.dispose(); } diff --git a/lib/pages/subscription/controller.dart b/lib/pages/subscription/controller.dart index 4d228dd9..ebc4757c 100644 --- a/lib/pages/subscription/controller.dart +++ b/lib/pages/subscription/controller.dart @@ -83,4 +83,10 @@ class SubController extends GetxController { ), ); } + + @override + void onClose() { + scrollController.dispose(); + super.onClose(); + } } diff --git a/lib/pages/subscription/view.dart b/lib/pages/subscription/view.dart index bd1a5223..1fce5f64 100644 --- a/lib/pages/subscription/view.dart +++ b/lib/pages/subscription/view.dart @@ -21,7 +21,6 @@ class _SubPageState extends State { @override void dispose() { _subController.scrollController.removeListener(() {}); - _subController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/video/detail/introduction/widgets/page.dart b/lib/pages/video/detail/introduction/widgets/page.dart index 59c95329..c87e4ca3 100644 --- a/lib/pages/video/detail/introduction/widgets/page.dart +++ b/lib/pages/video/detail/introduction/widgets/page.dart @@ -34,7 +34,7 @@ class _PagesPanelState extends State { // final String heroTag = Get.arguments['heroTag']; late final String heroTag; late VideoDetailController _videoDetailController; - final ScrollController _scrollController2 = ScrollController(); + final ScrollController _scrollController = ScrollController(); @override void initState() { @@ -50,9 +50,9 @@ class _PagesPanelState extends State { const double itemWidth = 150; // 每个列表项的宽度 final double targetOffset = min( (currentIndex * itemWidth) - (itemWidth / 2), - _scrollController2.position.maxScrollExtent); + _scrollController.position.maxScrollExtent); // 滑动至目标位置 - _scrollController2.animateTo( + _scrollController.animateTo( targetOffset, duration: const Duration(milliseconds: 300), // 滑动动画持续时间 curve: Curves.easeInOut, // 滑动动画曲线 @@ -62,7 +62,7 @@ class _PagesPanelState extends State { @override void dispose() { - _scrollController2.dispose(); + _scrollController.dispose(); super.dispose(); } @@ -114,7 +114,7 @@ class _PagesPanelState extends State { height: 35, margin: const EdgeInsets.only(bottom: 8), child: ListView.builder( - controller: _scrollController2, + controller: _scrollController, scrollDirection: Axis.horizontal, itemCount: widget.pages.length, itemExtent: 150, diff --git a/lib/pages/whisper_detail/controller.dart b/lib/pages/whisper_detail/controller.dart index 9f83dade..8bd9d81c 100644 --- a/lib/pages/whisper_detail/controller.dart +++ b/lib/pages/whisper_detail/controller.dart @@ -106,4 +106,10 @@ class WhisperDetailController extends GetxController { SmartDialog.showToast(result['msg']); } } + + @override + void onClose() { + replyContentController.dispose(); + super.onClose(); + } } diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index ae255f73..da6f9d81 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -46,7 +46,6 @@ class _WhisperDetailPageState extends State { _readOnlyStream.close(); _enableSend.close(); _focusNode.dispose(); - _whisperDetailController.replyContentController.dispose(); super.dispose(); }