From 33a4b408e150fa2a9bfe26ba85a4b719e080776f Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Thu, 29 Aug 2024 17:45:41 +0800 Subject: [PATCH] mod: handle dispose --- lib/common/widgets/animated_dialog.dart | 1 + lib/pages/bangumi/view.dart | 14 ++--- lib/pages/blacklist/index.dart | 1 + lib/pages/dynamics/detail/view.dart | 3 +- lib/pages/dynamics/view.dart | 15 ++--- lib/pages/fan/view.dart | 1 + lib/pages/fav/view.dart | 7 +++ lib/pages/fav_detail/view.dart | 2 + lib/pages/fav_search/view.dart | 15 +++-- lib/pages/follow/view.dart | 8 +-- lib/pages/follow_search/view.dart | 9 ++- lib/pages/history/view.dart | 1 + lib/pages/home/controller.dart | 6 ++ lib/pages/hot/view.dart | 13 ++--- lib/pages/html/view.dart | 8 +++ lib/pages/live/view.dart | 13 ++--- lib/pages/live_room/view.dart | 4 +- lib/pages/login/controller.dart | 42 +++++++------- lib/pages/login/view.dart | 5 ++ lib/pages/media/view.dart | 1 + lib/pages/member_archive/view.dart | 17 ++++-- lib/pages/member_dynamics/view.dart | 10 ++-- lib/pages/member_search/view.dart | 3 + lib/pages/member_seasons/view.dart | 16 ++++-- lib/pages/mine/view.dart | 1 - lib/pages/msg_feed_top/at_me/view.dart | 12 +++- lib/pages/msg_feed_top/like_me/view.dart | 8 ++- lib/pages/msg_feed_top/reply_me/view.dart | 8 ++- lib/pages/msg_feed_top/sys_msg/view.dart | 60 ++++++++++++-------- lib/pages/preview/view.dart | 1 - lib/pages/rank/zone/view.dart | 19 +++---- lib/pages/rcmd/view.dart | 1 + lib/pages/search/view.dart | 6 ++ lib/pages/search_panel/view.dart | 12 ++-- lib/pages/search_result/view.dart | 8 ++- lib/pages/setting/pages/display_mode.dart | 7 +++ lib/pages/subscription/view.dart | 17 ++++-- lib/pages/subscription_detail/view.dart | 2 + lib/pages/video/detail/reply/view.dart | 8 +++ lib/pages/video/detail/reply_reply/view.dart | 14 ++--- lib/pages/video/detail/view.dart | 1 + lib/pages/whisper/view.dart | 10 +++- lib/pages/whisper_detail/view.dart | 14 +++-- 43 files changed, 274 insertions(+), 150 deletions(-) diff --git a/lib/common/widgets/animated_dialog.dart b/lib/common/widgets/animated_dialog.dart index 7c7c4395..b27323b2 100644 --- a/lib/common/widgets/animated_dialog.dart +++ b/lib/common/widgets/animated_dialog.dart @@ -33,6 +33,7 @@ class AnimatedDialogState extends State @override void dispose() { + controller!.removeListener(() {}); controller!.dispose(); super.dispose(); } diff --git a/lib/pages/bangumi/view.dart b/lib/pages/bangumi/view.dart index 68b8ac40..aa1d56e8 100644 --- a/lib/pages/bangumi/view.dart +++ b/lib/pages/bangumi/view.dart @@ -26,7 +26,6 @@ class _BangumiPageState extends State final BangumiController _bangumiController = Get.put(BangumiController()); late Future? _futureBuilderFuture; late Future? _futureBuilderFutureFollow; - late ScrollController scrollController; @override bool get wantKeepAlive => true; @@ -34,17 +33,17 @@ class _BangumiPageState extends State @override void initState() { super.initState(); - scrollController = _bangumiController.scrollController; StreamController mainStream = Get.find().bottomBarStream; StreamController searchBarStream = Get.find().searchBarStream; _futureBuilderFuture = _bangumiController.queryBangumiListFeed(); _futureBuilderFutureFollow = _bangumiController.queryBangumiFollow(); - scrollController.addListener( + _bangumiController.scrollController.addListener( () async { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 200) { + if (_bangumiController.scrollController.position.pixels >= + _bangumiController.scrollController.position.maxScrollExtent - + 200) { EasyThrottle.throttle('my-throttler', const Duration(seconds: 1), () { _bangumiController.isLoadingMore = true; _bangumiController.onLoad(); @@ -52,7 +51,7 @@ class _BangumiPageState extends State } final ScrollDirection direction = - scrollController.position.userScrollDirection; + _bangumiController.scrollController.position.userScrollDirection; if (direction == ScrollDirection.forward) { mainStream.add(true); searchBarStream.add(true); @@ -66,7 +65,8 @@ class _BangumiPageState extends State @override void dispose() { - scrollController.removeListener(() {}); + _bangumiController.scrollController.removeListener(() {}); + _bangumiController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/blacklist/index.dart b/lib/pages/blacklist/index.dart index ab3ac402..bfaaf132 100644 --- a/lib/pages/blacklist/index.dart +++ b/lib/pages/blacklist/index.dart @@ -48,6 +48,7 @@ class _BlackListPageState extends State { _blackListController.blackList.map((e) => e.mid!).toList(); localCache.put(LocalCacheKey.blackMidsList, blackMidsList); scrollController.removeListener(() {}); + scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/dynamics/detail/view.dart b/lib/pages/dynamics/detail/view.dart index 69823866..c2125030 100644 --- a/lib/pages/dynamics/detail/view.dart +++ b/lib/pages/dynamics/detail/view.dart @@ -182,8 +182,9 @@ class _DynamicDetailPageState extends State @override void dispose() { - scrollController.removeListener(() {}); + titleStreamC.close(); fabAnimationCtr.dispose(); + scrollController.removeListener(() {}); scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart index 08787682..7a10e84b 100644 --- a/lib/pages/dynamics/view.dart +++ b/lib/pages/dynamics/view.dart @@ -26,7 +26,6 @@ class _DynamicsPageState extends State final DynamicsController _dynamicsController = Get.put(DynamicsController()); late Future _futureBuilderFutureUp; Box userInfoCache = GStorage.userInfo; - late ScrollController scrollController; late UpPanelPosition upPanelPosition; @override @@ -57,12 +56,12 @@ class _DynamicsPageState extends State SettingBoxKey.upPanelPosition, defaultValue: UpPanelPosition.leftFixed.code)]; print('upPanelPosition: $upPanelPosition'); - scrollController = _dynamicsController.scrollController; if (GStorage.setting .get(SettingBoxKey.dynamicsShowAllFollowedUp, defaultValue: false)) { - scrollController.addListener(() { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 300) { + _dynamicsController.scrollController.addListener(() { + if (_dynamicsController.scrollController.position.pixels >= + _dynamicsController.scrollController.position.maxScrollExtent - + 300) { EasyThrottle.throttle('following', const Duration(seconds: 1), () { _dynamicsController.queryFollowing2(); }); @@ -75,6 +74,8 @@ class _DynamicsPageState extends State void dispose() { _dynamicsController.tabController.removeListener(() {}); _dynamicsController.tabController.dispose(); + _dynamicsController.scrollController.removeListener(() {}); + _dynamicsController.scrollController.dispose(); super.dispose(); } @@ -96,8 +97,8 @@ class _DynamicsPageState extends State } Map data = snapshot.data; if (data['status']) { - return Obx(() => UpPanel( - _dynamicsController.upData.value, scrollController)); + return Obx(() => UpPanel(_dynamicsController.upData.value, + _dynamicsController.scrollController)); } else { return const SizedBox(); } diff --git a/lib/pages/fan/view.dart b/lib/pages/fan/view.dart index eac766f5..8bf03482 100644 --- a/lib/pages/fan/view.dart +++ b/lib/pages/fan/view.dart @@ -44,6 +44,7 @@ class _FansPageState extends State { @override void dispose() { scrollController.removeListener(() {}); + scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/fav/view.dart b/lib/pages/fav/view.dart index 69a4a577..44b76a0a 100644 --- a/lib/pages/fav/view.dart +++ b/lib/pages/fav/view.dart @@ -38,6 +38,13 @@ class _FavPageState extends State { ); } + @override + void dispose() { + scrollController.removeListener(() {}); + scrollController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart index 8e488c95..09894d2e 100644 --- a/lib/pages/fav_detail/view.dart +++ b/lib/pages/fav_detail/view.dart @@ -54,6 +54,8 @@ class _FavDetailPageState extends State { @override void dispose() { + titleStreamC.close(); + _controller.removeListener(() {}); _controller.dispose(); super.dispose(); } diff --git a/lib/pages/fav_search/view.dart b/lib/pages/fav_search/view.dart index 78bf7173..f8b4e8ac 100644 --- a/lib/pages/fav_search/view.dart +++ b/lib/pages/fav_search/view.dart @@ -16,18 +16,16 @@ class FavSearchPage extends StatefulWidget { class _FavSearchPageState extends State { final FavSearchController _favSearchCtr = Get.put(FavSearchController()); - late ScrollController scrollController; late int searchType; @override void initState() { super.initState(); searchType = int.parse(Get.parameters['searchType']!); - scrollController = _favSearchCtr.scrollController; - scrollController.addListener( + _favSearchCtr.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 300) { + if (_favSearchCtr.scrollController.position.pixels >= + _favSearchCtr.scrollController.position.maxScrollExtent - 300) { EasyThrottle.throttle('fav', const Duration(seconds: 1), () { _favSearchCtr.onLoad(); }); @@ -38,8 +36,9 @@ class _FavSearchPageState extends State { @override void dispose() { - scrollController.removeListener(() {}); - scrollController.dispose(); + _favSearchCtr.searchFocusNode.dispose(); + _favSearchCtr.scrollController.removeListener(() {}); + _favSearchCtr.scrollController.dispose(); super.dispose(); } @@ -86,7 +85,7 @@ class _FavSearchPageState extends State { ) : _favSearchCtr.favList.isNotEmpty ? ListView.builder( - controller: scrollController, + controller: _favSearchCtr.scrollController, itemCount: _favSearchCtr.favList.length + 1, itemBuilder: (context, index) { if (index == _favSearchCtr.favList.length) { diff --git a/lib/pages/follow/view.dart b/lib/pages/follow/view.dart index ea69e159..f41c525f 100644 --- a/lib/pages/follow/view.dart +++ b/lib/pages/follow/view.dart @@ -14,7 +14,6 @@ class FollowPage extends StatefulWidget { class _FollowPageState extends State { late String mid; late FollowController _followController; - final ScrollController scrollController = ScrollController(); @override void initState() { @@ -39,10 +38,9 @@ class _FollowPageState extends State { ), actions: [ IconButton( - onPressed: () => Get.toNamed('/followSearch?mid=$mid'), - icon: const Icon(Icons.search_outlined), - tooltip: '搜索' - ), + onPressed: () => Get.toNamed('/followSearch?mid=$mid'), + icon: const Icon(Icons.search_outlined), + tooltip: '搜索'), PopupMenuButton( icon: const Icon(Icons.more_vert), itemBuilder: (BuildContext context) => [ diff --git a/lib/pages/follow_search/view.dart b/lib/pages/follow_search/view.dart index 683ab52c..8d8ac8c5 100644 --- a/lib/pages/follow_search/view.dart +++ b/lib/pages/follow_search/view.dart @@ -1,5 +1,4 @@ import 'package:easy_debounce/easy_throttle.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; @@ -20,6 +19,14 @@ class _FollowSearchPageState extends State { late Future? _futureBuilder; final ScrollController scrollController = ScrollController(); + @override + void dispose() { + _followSearchController.searchFocusNode.dispose(); + scrollController.removeListener(() {}); + scrollController.dispose(); + super.dispose(); + } + @override void initState() { super.initState(); diff --git a/lib/pages/history/view.dart b/lib/pages/history/view.dart index d743b8f3..c4224335 100644 --- a/lib/pages/history/view.dart +++ b/lib/pages/history/view.dart @@ -61,6 +61,7 @@ class _HistoryPageState extends State { @override void dispose() { scrollController.removeListener(() {}); + scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/home/controller.dart b/lib/pages/home/controller.dart index a22b3c71..79348a0e 100644 --- a/lib/pages/home/controller.dart +++ b/lib/pages/home/controller.dart @@ -116,6 +116,12 @@ class HomeController extends GetxController with GetTickerProviderStateMixin { } } + @override + void dispose() { + tabController.animation!.removeListener(() {}); + super.dispose(); + } + void searchDefault() async { var res = await Request().get(Api.searchDefault); if (res.data['code'] == 0) { diff --git a/lib/pages/hot/view.dart b/lib/pages/hot/view.dart index 7b4d3648..0263a739 100644 --- a/lib/pages/hot/view.dart +++ b/lib/pages/hot/view.dart @@ -26,7 +26,6 @@ class _HotPageState extends State with AutomaticKeepAliveClientMixin { final HotController _hotController = Get.put(HotController()); List videoList = []; Future? _futureBuilderFuture; - late ScrollController scrollController; @override bool get wantKeepAlive => true; @@ -35,15 +34,14 @@ class _HotPageState extends State with AutomaticKeepAliveClientMixin { void initState() { super.initState(); _futureBuilderFuture = _hotController.queryHotFeed('init'); - scrollController = _hotController.scrollController; StreamController mainStream = Get.find().bottomBarStream; StreamController searchBarStream = Get.find().searchBarStream; - scrollController.addListener( + _hotController.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 200) { + if (_hotController.scrollController.position.pixels >= + _hotController.scrollController.position.maxScrollExtent - 200) { if (!_hotController.isLoadingMore) { _hotController.isLoadingMore = true; _hotController.onLoad(); @@ -51,7 +49,7 @@ class _HotPageState extends State with AutomaticKeepAliveClientMixin { } final ScrollDirection direction = - scrollController.position.userScrollDirection; + _hotController.scrollController.position.userScrollDirection; if (direction == ScrollDirection.forward) { mainStream.add(true); searchBarStream.add(true); @@ -65,7 +63,8 @@ class _HotPageState extends State with AutomaticKeepAliveClientMixin { @override void dispose() { - scrollController.removeListener(() {}); + _hotController.scrollController.removeListener(() {}); + _hotController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/html/view.dart b/lib/pages/html/view.dart index e73aea3f..cbb9379d 100644 --- a/lib/pages/html/view.dart +++ b/lib/pages/html/view.dart @@ -54,6 +54,14 @@ class _HtmlRenderPageState extends State scrollListener(); } + @override + void dispose() { + fabAnimationCtr.dispose(); + scrollController.removeListener(() {}); + scrollController.dispose(); + super.dispose(); + } + void scrollListener() { scrollController = _htmlRenderCtr.scrollController; scrollController.addListener( diff --git a/lib/pages/live/view.dart b/lib/pages/live/view.dart index b11d2e51..35fe0d96 100644 --- a/lib/pages/live/view.dart +++ b/lib/pages/live/view.dart @@ -27,7 +27,6 @@ class _LivePageState extends State with AutomaticKeepAliveClientMixin { final LiveController _liveController = Get.put(LiveController()); late Future _futureBuilderFuture; - late ScrollController scrollController; @override bool get wantKeepAlive => true; @@ -36,15 +35,14 @@ class _LivePageState extends State void initState() { super.initState(); _futureBuilderFuture = _liveController.queryLiveList('init'); - scrollController = _liveController.scrollController; StreamController mainStream = Get.find().bottomBarStream; StreamController searchBarStream = Get.find().searchBarStream; - scrollController.addListener( + _liveController.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 200) { + if (_liveController.scrollController.position.pixels >= + _liveController.scrollController.position.maxScrollExtent - 200) { EasyThrottle.throttle('liveList', const Duration(milliseconds: 200), () { _liveController.onLoad(); @@ -52,7 +50,7 @@ class _LivePageState extends State } final ScrollDirection direction = - scrollController.position.userScrollDirection; + _liveController.scrollController.position.userScrollDirection; if (direction == ScrollDirection.forward) { mainStream.add(true); searchBarStream.add(true); @@ -66,7 +64,8 @@ class _LivePageState extends State @override void dispose() { - scrollController.removeListener(() {}); + _liveController.scrollController.removeListener(() {}); + _liveController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index f9454fc4..f7d5c126 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -45,7 +45,7 @@ class _LiveRoomPageState extends State { @override void dispose() { floating?.dispose(); - plPlayerController!.dispose(); + plPlayerController?.dispose(); super.dispose(); } @@ -176,7 +176,7 @@ class _LiveRoomPageState extends State { ), //内置浏览器打开 IconButton( - tooltip: '内置浏览器打开', + tooltip: '内置浏览器打开', onPressed: () { Get.offNamed( '/webview', diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index 187d7a69..baef3255 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -326,14 +326,13 @@ class LoginPageController extends GetxController String captchaKey = ''; Get.dialog(AlertDialog( title: const Text("本次登录需要验证您的手机号"), - content: Column( - children:[ - Text(accountInfo['hindTel'] ?? '未能获取手机号'), - TextField( - controller: _textFieldController, - decoration: const InputDecoration(hintText: "请输入短信验证码"), - ),]), - + content: Column(children: [ + Text(accountInfo['hindTel'] ?? '未能获取手机号'), + TextField( + controller: _textFieldController, + decoration: const InputDecoration(hintText: "请输入短信验证码"), + ), + ]), actions: [ TextButton( child: const Text("发送验证码 "), @@ -349,12 +348,13 @@ class LoginPageController extends GetxController captchaData.token = preCaptureRes['data']['recaptcha_token']!; getCaptcha(geeGt, geeChallenge, () async { - var safeCenterSendSmsCodeRes = await LoginHttp.safeCenterSmsCode( - tmpCode: currentUri.queryParameters['tmp_token']!, - geeChallenge: geeChallenge, - geeSeccode: captchaData.seccode!, - geeValidate: captchaData.validate!, - recaptchaToken: captchaData.token!); + var safeCenterSendSmsCodeRes = + await LoginHttp.safeCenterSmsCode( + tmpCode: currentUri.queryParameters['tmp_token']!, + geeChallenge: geeChallenge, + geeSeccode: captchaData.seccode!, + geeValidate: captchaData.validate!, + recaptchaToken: captchaData.token!); if (!safeCenterSendSmsCodeRes['status']) { SmartDialog.showToast("发送短信验证码失败,请尝试其它登录方式\n" "(${safeCenterSendSmsCodeRes['code']}) ${safeCenterSendSmsCodeRes['msg']}"); @@ -376,12 +376,13 @@ class LoginPageController extends GetxController SmartDialog.showToast("请输入短信验证码"); return; } - var safeCenterSmsVerifyRes = await LoginHttp.safeCenterSmsVerify( - code: code, - tmpCode: currentUri.queryParameters['tmp_token']!, - requestId: currentUri.queryParameters['request_id']!, - source: currentUri.queryParameters['source']!, - captchaKey: captchaKey, + var safeCenterSmsVerifyRes = + await LoginHttp.safeCenterSmsVerify( + code: code, + tmpCode: currentUri.queryParameters['tmp_token']!, + requestId: currentUri.queryParameters['request_id']!, + source: currentUri.queryParameters['source']!, + captchaKey: captchaKey, ); if (!safeCenterSmsVerifyRes['status']) { SmartDialog.showToast("验证短信验证码失败,请尝试其它登录方式\n" @@ -396,7 +397,6 @@ class LoginPageController extends GetxController ], )); - return; } if (data['token_info'] == null || data['cookie_info'] == null) { diff --git a/lib/pages/login/view.dart b/lib/pages/login/view.dart index 7ad7e2d9..ea8aa013 100644 --- a/lib/pages/login/view.dart +++ b/lib/pages/login/view.dart @@ -25,6 +25,7 @@ class _LoginPageState extends State { // 二维码生成时间 bool showPassword = false; GlobalKey globalKey = GlobalKey(); + @override void initState() { super.initState(); @@ -33,6 +34,10 @@ class _LoginPageState extends State { @override void dispose() { _loginPageCtr.dispose(); + _loginPageCtr.telTextController.dispose(); + _loginPageCtr.usernameTextController.dispose(); + _loginPageCtr.passwordTextController.dispose(); + _loginPageCtr.smsCodeTextController.dispose(); super.dispose(); } diff --git a/lib/pages/media/view.dart b/lib/pages/media/view.dart index 27b16045..0cb02d83 100644 --- a/lib/pages/media/view.dart +++ b/lib/pages/media/view.dart @@ -55,6 +55,7 @@ class _MediaPageState extends State @override void dispose() { mediaController.scrollController.removeListener(() {}); + mediaController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/member_archive/view.dart b/lib/pages/member_archive/view.dart index fcce7a6e..270f0002 100644 --- a/lib/pages/member_archive/view.dart +++ b/lib/pages/member_archive/view.dart @@ -18,9 +18,15 @@ class MemberArchivePage extends StatefulWidget { class _MemberArchivePageState extends State { late MemberArchiveController _memberArchivesController; late Future _futureBuilderFuture; - late ScrollController scrollController; late int mid; + @override + void dispose() { + _memberArchivesController.scrollController.removeListener(() {}); + _memberArchivesController.scrollController.dispose(); + super.dispose(); + } + @override void initState() { super.initState(); @@ -29,11 +35,12 @@ class _MemberArchivePageState extends State { _memberArchivesController = Get.put(MemberArchiveController(), tag: heroTag); _futureBuilderFuture = _memberArchivesController.getMemberArchive('init'); - scrollController = _memberArchivesController.scrollController; - scrollController.addListener( + _memberArchivesController.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 200) { + if (_memberArchivesController.scrollController.position.pixels >= + _memberArchivesController + .scrollController.position.maxScrollExtent - + 200) { EasyThrottle.throttle( 'member_archives', const Duration(milliseconds: 500), () { _memberArchivesController.onLoad(); diff --git a/lib/pages/member_dynamics/view.dart b/lib/pages/member_dynamics/view.dart index a75e2566..c5744240 100644 --- a/lib/pages/member_dynamics/view.dart +++ b/lib/pages/member_dynamics/view.dart @@ -21,7 +21,6 @@ class MemberDynamicsPage extends StatefulWidget { class _MemberDynamicsPageState extends State { late MemberDynamicsController _memberDynamicController; late Future _futureBuilderFuture; - late ScrollController scrollController; late int mid; late bool dynamicsWaterfallFlow; @@ -34,11 +33,11 @@ class _MemberDynamicsPageState extends State { Get.put(MemberDynamicsController(), tag: heroTag); _futureBuilderFuture = _memberDynamicController.getMemberDynamic('onRefresh'); - scrollController = _memberDynamicController.scrollController; - scrollController.addListener( + _memberDynamicController.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 200) { + if (_memberDynamicController.scrollController.position.pixels >= + _memberDynamicController.scrollController.position.maxScrollExtent - + 200) { EasyThrottle.throttle( 'member_dynamics', const Duration(milliseconds: 1000), () { _memberDynamicController.onLoad(); @@ -53,6 +52,7 @@ class _MemberDynamicsPageState extends State { @override void dispose() { _memberDynamicController.scrollController.removeListener(() {}); + _memberDynamicController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/member_search/view.dart b/lib/pages/member_search/view.dart index 0d14e641..f665449a 100644 --- a/lib/pages/member_search/view.dart +++ b/lib/pages/member_search/view.dart @@ -44,6 +44,9 @@ class _MemberSearchPageState extends State @override void dispose() { // _tabController.dispose(); + _memberSearchCtr.searchFocusNode.dispose(); + scrollController.removeListener(() {}); + scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/member_seasons/view.dart b/lib/pages/member_seasons/view.dart index 1e9701fd..e1e32661 100644 --- a/lib/pages/member_seasons/view.dart +++ b/lib/pages/member_seasons/view.dart @@ -17,18 +17,24 @@ class _MemberSeasonsPageState extends State { final MemberSeasonsController _memberSeasonsController = Get.put(MemberSeasonsController()); late Future _futureBuilderFuture; - late ScrollController scrollController; + + @override + void dispose() { + _memberSeasonsController.scrollController.removeListener(() {}); + _memberSeasonsController.scrollController.dispose(); + super.dispose(); + } @override void initState() { super.initState(); _futureBuilderFuture = _memberSeasonsController.getSeasonDetail('onRefresh'); - scrollController = _memberSeasonsController.scrollController; - scrollController.addListener( + _memberSeasonsController.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 200) { + if (_memberSeasonsController.scrollController.position.pixels >= + _memberSeasonsController.scrollController.position.maxScrollExtent - + 200) { EasyThrottle.throttle( 'member_archives', const Duration(milliseconds: 500), () { _memberSeasonsController.onLoad(); diff --git a/lib/pages/mine/view.dart b/lib/pages/mine/view.dart index 3ebac0aa..34fd82de 100644 --- a/lib/pages/mine/view.dart +++ b/lib/pages/mine/view.dart @@ -1,6 +1,5 @@ // ignore_for_file: no_leading_underscores_for_local_identifiers -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPalaX/common/constants.dart'; diff --git a/lib/pages/msg_feed_top/at_me/view.dart b/lib/pages/msg_feed_top/at_me/view.dart index c1aa2ee9..d7155f1a 100644 --- a/lib/pages/msg_feed_top/at_me/view.dart +++ b/lib/pages/msg_feed_top/at_me/view.dart @@ -1,6 +1,5 @@ import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:PiliPalaX/common/widgets/network_img_layer.dart'; @@ -25,6 +24,13 @@ class _AtMePageState extends State { _scrollController.addListener(_scrollListener); } + @override + void dispose() { + _scrollController.removeListener(_scrollListener); + _scrollController.dispose(); + super.dispose(); + } + Future _scrollListener() async { if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 200) { @@ -63,8 +69,8 @@ class _AtMePageState extends State { itemBuilder: (_, int i) { return ListTile( onTap: () { - String? nativeUri = _atMeController - .msgFeedAtMeList[i].item?.nativeUri; + String? nativeUri = + _atMeController.msgFeedAtMeList[i].item?.nativeUri; if (nativeUri != null) { PiliScheme.routePush(Uri.parse(nativeUri)); } diff --git a/lib/pages/msg_feed_top/like_me/view.dart b/lib/pages/msg_feed_top/like_me/view.dart index 03fae406..6b9dfa9a 100644 --- a/lib/pages/msg_feed_top/like_me/view.dart +++ b/lib/pages/msg_feed_top/like_me/view.dart @@ -1,6 +1,5 @@ import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:PiliPalaX/common/widgets/network_img_layer.dart'; @@ -26,6 +25,13 @@ class _LikeMePageState extends State { _scrollController.addListener(_scrollListener); } + @override + void dispose() { + _scrollController.removeListener(_scrollListener); + _scrollController.dispose(); + super.dispose(); + } + Future _scrollListener() async { if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 200) { diff --git a/lib/pages/msg_feed_top/reply_me/view.dart b/lib/pages/msg_feed_top/reply_me/view.dart index 4b4d2cca..295dfdf9 100644 --- a/lib/pages/msg_feed_top/reply_me/view.dart +++ b/lib/pages/msg_feed_top/reply_me/view.dart @@ -1,6 +1,5 @@ import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:PiliPalaX/common/widgets/network_img_layer.dart'; @@ -26,6 +25,13 @@ class _ReplyMePageState extends State { _scrollController.addListener(_scrollListener); } + @override + void dispose() { + _scrollController.removeListener(_scrollListener); + _scrollController.dispose(); + super.dispose(); + } + Future _scrollListener() async { if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 200) { diff --git a/lib/pages/msg_feed_top/sys_msg/view.dart b/lib/pages/msg_feed_top/sys_msg/view.dart index da35fa4e..9ccb7777 100644 --- a/lib/pages/msg_feed_top/sys_msg/view.dart +++ b/lib/pages/msg_feed_top/sys_msg/view.dart @@ -24,6 +24,13 @@ class _SysMsgPageState extends State { _scrollController.addListener(_scrollListener); } + @override + void dispose() { + _scrollController.removeListener(_scrollListener); + _scrollController.dispose(); + super.dispose(); + } + Future _scrollListener() async { if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 200) { @@ -60,7 +67,8 @@ class _SysMsgPageState extends State { shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemBuilder: (_, int i) { - String? content = _sysMsgController.msgFeedSysMsgList[i].content; + String? content = + _sysMsgController.msgFeedSysMsgList[i].content; if (content != null) { try { dynamic jsonContent = json.decode(content); @@ -73,36 +81,38 @@ class _SysMsgPageState extends State { onTap: () {}, title: Text( "${_sysMsgController.msgFeedSysMsgList[i].title}", - style: Theme.of(context).textTheme.titleMedium!.copyWith( - color: Theme.of(context).colorScheme.primary - ), + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + color: Theme.of(context).colorScheme.primary), ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 4), - SelectableText( - "$content", - style: Theme.of(context) - .textTheme - .bodySmall! - .copyWith( - color: Theme.of(context) - .colorScheme - .outline)), + SelectableText("$content", + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith( + color: Theme.of(context) + .colorScheme + .outline)), const SizedBox(height: 4), - Text( - "${_sysMsgController.msgFeedSysMsgList[i].timeAt}", - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: Theme.of(context) - .textTheme - .bodySmall! - .copyWith( - color: Theme.of(context) - .colorScheme - .outline.withOpacity(0.8))), - ])); + Text( + "${_sysMsgController.msgFeedSysMsgList[i].timeAt}", + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith( + color: Theme.of(context) + .colorScheme + .outline + .withOpacity(0.8))), + ])); }, separatorBuilder: (BuildContext context, int index) { return Divider( diff --git a/lib/pages/preview/view.dart b/lib/pages/preview/view.dart index 47ec986b..7dcc914f 100644 --- a/lib/pages/preview/view.dart +++ b/lib/pages/preview/view.dart @@ -2,7 +2,6 @@ import 'dart:io'; -import 'package:dismissible_page/dismissible_page.dart'; import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; diff --git a/lib/pages/rank/zone/view.dart b/lib/pages/rank/zone/view.dart index 261cdb5a..617d8e03 100644 --- a/lib/pages/rank/zone/view.dart +++ b/lib/pages/rank/zone/view.dart @@ -28,7 +28,6 @@ class _ZonePageState extends State with AutomaticKeepAliveClientMixin { late ZoneController _zoneController; Future? _futureBuilderFuture; - late ScrollController scrollController; @override bool get wantKeepAlive => true; @@ -38,15 +37,14 @@ class _ZonePageState extends State super.initState(); _zoneController = Get.put(ZoneController(), tag: widget.rid.toString()); _futureBuilderFuture = _zoneController.queryRankFeed('init', widget.rid); - scrollController = _zoneController.scrollController; StreamController mainStream = Get.find().bottomBarStream; StreamController searchBarStream = Get.find().searchBarStream; - scrollController.addListener( + _zoneController.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 200) { + if (_zoneController.scrollController.position.pixels >= + _zoneController.scrollController.position.maxScrollExtent - 200) { if (!_zoneController.isLoadingMore) { _zoneController.isLoadingMore = true; _zoneController.onLoad(); @@ -54,7 +52,7 @@ class _ZonePageState extends State } final ScrollDirection direction = - scrollController.position.userScrollDirection; + _zoneController.scrollController.position.userScrollDirection; if (direction == ScrollDirection.forward) { mainStream.add(true); searchBarStream.add(true); @@ -68,7 +66,8 @@ class _ZonePageState extends State @override void dispose() { - scrollController.removeListener(() {}); + _zoneController.scrollController.removeListener(() {}); + _zoneController.scrollController.dispose(); super.dispose(); } @@ -80,12 +79,12 @@ class _ZonePageState extends State return await _zoneController.onRefresh(); }, child: CustomScrollView( - controller: scrollController, + controller: _zoneController.scrollController, slivers: [ SliverPadding( // 单列布局 EdgeInsets.zero - padding: - const EdgeInsets.fromLTRB(StyleString.cardSpace, StyleString.safeSpace, 0, 0), + padding: const EdgeInsets.fromLTRB( + StyleString.cardSpace, StyleString.safeSpace, 0, 0), sliver: FutureBuilder( future: _futureBuilderFuture, builder: (context, snapshot) { diff --git a/lib/pages/rcmd/view.dart b/lib/pages/rcmd/view.dart index 25c47331..51db18b7 100644 --- a/lib/pages/rcmd/view.dart +++ b/lib/pages/rcmd/view.dart @@ -65,6 +65,7 @@ class _RcmdPageState extends State @override void dispose() { _rcmdController.scrollController.removeListener(() {}); + _rcmdController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/search/view.dart b/lib/pages/search/view.dart index 994f40e9..3de75ecb 100644 --- a/lib/pages/search/view.dart +++ b/lib/pages/search/view.dart @@ -25,6 +25,12 @@ class _SearchPageState extends State with RouteAware { _futureBuilderFuture = _searchController.queryHotSearchList(); } + @override + void dispose() { + _searchController.searchFocusNode.dispose(); + super.dispose(); + } + @override // 返回当前页面时 void didPopNext() async { diff --git a/lib/pages/search_panel/view.dart b/lib/pages/search_panel/view.dart index 53b06625..08fac406 100644 --- a/lib/pages/search_panel/view.dart +++ b/lib/pages/search_panel/view.dart @@ -32,7 +32,6 @@ class _SearchPanelState extends State late SearchPanelController _searchPanelController; late Future _futureBuilderFuture; - late ScrollController scrollController; @override bool get wantKeepAlive => true; @@ -47,10 +46,10 @@ class _SearchPanelState extends State ), tag: widget.searchType!.type + widget.keyword!, ); - scrollController = _searchPanelController.scrollController; - scrollController.addListener(() async { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 100) { + _searchPanelController.scrollController.addListener(() async { + if (_searchPanelController.scrollController.position.pixels >= + _searchPanelController.scrollController.position.maxScrollExtent - + 100) { EasyThrottle.throttle('history', const Duration(seconds: 1), () { _searchPanelController.onSearch(type: 'onLoad'); }); @@ -61,7 +60,8 @@ class _SearchPanelState extends State @override void dispose() { - scrollController.removeListener(() {}); + _searchPanelController.scrollController.removeListener(() {}); + _searchPanelController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/search_result/view.dart b/lib/pages/search_result/view.dart index 33c3489c..57a6beca 100644 --- a/lib/pages/search_result/view.dart +++ b/lib/pages/search_result/view.dart @@ -14,7 +14,7 @@ class SearchResultPage extends StatefulWidget { class _SearchResultPageState extends State with TickerProviderStateMixin { late SearchResultController? _searchResultController; - late TabController? _tabController; + late TabController _tabController; @override void initState() { @@ -29,6 +29,12 @@ class _SearchResultPageState extends State ); } + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/pages/setting/pages/display_mode.dart b/lib/pages/setting/pages/display_mode.dart index 3dafdca7..1d95f8a9 100644 --- a/lib/pages/setting/pages/display_mode.dart +++ b/lib/pages/setting/pages/display_mode.dart @@ -32,6 +32,13 @@ class _SetDisplayModeState extends State { }); } + @override + void dispose() { + controller.removeListener(() {}); + controller.dispose(); + super.dispose(); + } + // 获取所有的mode Future fetchAll() async { preferred = await FlutterDisplayMode.preferred; diff --git a/lib/pages/subscription/view.dart b/lib/pages/subscription/view.dart index 001f2382..34bfed58 100644 --- a/lib/pages/subscription/view.dart +++ b/lib/pages/subscription/view.dart @@ -17,17 +17,22 @@ class SubPage extends StatefulWidget { class _SubPageState extends State { final SubController _subController = Get.put(SubController()); late Future _futureBuilderFuture; - late ScrollController scrollController; + + @override + void dispose() { + _subController.scrollController.removeListener(() {}); + _subController.scrollController.dispose(); + super.dispose(); + } @override void initState() { super.initState(); _futureBuilderFuture = _subController.querySubFolder(); - scrollController = _subController.scrollController; - scrollController.addListener( + _subController.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 300) { + if (_subController.scrollController.position.pixels >= + _subController.scrollController.position.maxScrollExtent - 300) { EasyThrottle.throttle('history', const Duration(seconds: 1), () { _subController.onLoad(); }); @@ -54,7 +59,7 @@ class _SubPageState extends State { Map? data = snapshot.data; if (data != null && data['status']) { return Obx(() => CustomScrollView( - controller: scrollController, + controller: _subController.scrollController, physics: const AlwaysScrollableScrollPhysics(), slivers: [ SliverGrid( diff --git a/lib/pages/subscription_detail/view.dart b/lib/pages/subscription_detail/view.dart index b25c75d8..cb8affdc 100644 --- a/lib/pages/subscription_detail/view.dart +++ b/lib/pages/subscription_detail/view.dart @@ -54,6 +54,8 @@ class _SubDetailPageState extends State { @override void dispose() { + titleStreamC.close(); + _controller.removeListener(() {}); _controller.dispose(); super.dispose(); } diff --git a/lib/pages/video/detail/reply/view.dart b/lib/pages/video/detail/reply/view.dart index 20898c52..d6ae92c4 100644 --- a/lib/pages/video/detail/reply/view.dart +++ b/lib/pages/video/detail/reply/view.dart @@ -67,6 +67,14 @@ class _VideoReplyPanelState extends State scrollListener(); } + @override + void dispose() { + fabAnimationCtr.dispose(); + scrollController.removeListener(() {}); + scrollController.dispose(); + super.dispose(); + } + void scrollListener() { scrollController = _videoReplyController.scrollController; scrollController.addListener( diff --git a/lib/pages/video/detail/reply_reply/view.dart b/lib/pages/video/detail/reply_reply/view.dart index e593d37d..475d0c6a 100644 --- a/lib/pages/video/detail/reply_reply/view.dart +++ b/lib/pages/video/detail/reply_reply/view.dart @@ -33,9 +33,7 @@ class VideoReplyReplyPanel extends StatefulWidget { class _VideoReplyReplyPanelState extends State { late VideoReplyReplyController _videoReplyReplyController; - late AnimationController replyAnimationCtl; Future? _futureBuilderFuture; - late ScrollController scrollController; @override void initState() { @@ -46,11 +44,12 @@ class _VideoReplyReplyPanelState extends State { tag: widget.rpid.toString()); // 上拉加载更多 - scrollController = _videoReplyReplyController.scrollController; - scrollController.addListener( + _videoReplyReplyController.scrollController.addListener( () { - if (scrollController.position.pixels >= - scrollController.position.maxScrollExtent - 300) { + if (_videoReplyReplyController.scrollController.position.pixels >= + _videoReplyReplyController + .scrollController.position.maxScrollExtent - + 300) { EasyThrottle.throttle('replylist', const Duration(milliseconds: 200), () { _videoReplyReplyController.queryReplyList(type: 'onLoad'); @@ -66,7 +65,8 @@ class _VideoReplyReplyPanelState extends State { @override void dispose() { - // scrollController.dispose(); + _videoReplyReplyController.scrollController.removeListener(() {}); + _videoReplyReplyController.scrollController.dispose(); super.dispose(); } diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index e1e9c48b..c866acd5 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -262,6 +262,7 @@ class _VideoDetailPageState extends State @override void dispose() { + appbarStream.close(); floating.dispose(); videoDetailController.floating?.dispose(); videoIntroController.videoDetail.close(); diff --git a/lib/pages/whisper/view.dart b/lib/pages/whisper/view.dart index bcf69a13..c61387f7 100644 --- a/lib/pages/whisper/view.dart +++ b/lib/pages/whisper/view.dart @@ -28,6 +28,13 @@ class _WhisperPageState extends State { _scrollController.addListener(_scrollListener); } + @override + void dispose() { + _scrollController.removeListener(_scrollListener); + _scrollController.dispose(); + super.dispose(); + } + Future _scrollListener() async { if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 200) { @@ -201,7 +208,8 @@ class _WhisperPageState extends State { width: 45, height: 45, type: 'avatar', - src: sessionList[i].accountInfo?.face ?? "", + src: sessionList[i].accountInfo?.face ?? + "", ), ), title: Text( diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index c21328d4..2ad32589 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -22,7 +22,6 @@ class _WhisperDetailPageState extends State with WidgetsBindingObserver { final WhisperDetailController _whisperDetailController = Get.put(WhisperDetailController()); - late TextEditingController _replyContentController; final FocusNode replyContentFocusNode = FocusNode(); final _debouncer = Debouncer(milliseconds: 200); // 设置延迟时间 late double emoteHeight = 0.0; @@ -35,7 +34,6 @@ class _WhisperDetailPageState extends State super.initState(); WidgetsBinding.instance.addObserver(this); _whisperDetailController.querySessionMsg(); - _replyContentController = _whisperDetailController.replyContentController; _focusListener(); } @@ -82,17 +80,20 @@ class _WhisperDetailPageState extends State WidgetsBinding.instance.removeObserver(this); replyContentFocusNode.removeListener(() {}); replyContentFocusNode.dispose(); + _whisperDetailController.replyContentController.dispose(); super.dispose(); } void onChooseEmote(Packages package, Emote emote) { - int cursorPosition = _replyContentController.selection.baseOffset; + int cursorPosition = + _whisperDetailController.replyContentController.selection.baseOffset; if (cursorPosition == -1) cursorPosition = 0; - final String currentText = _replyContentController.text; + final String currentText = + _whisperDetailController.replyContentController.text; final String newText = currentText.substring(0, cursorPosition) + emote.text! + currentText.substring(cursorPosition); - _replyContentController.value = TextEditingValue( + _whisperDetailController.replyContentController.value = TextEditingValue( text: newText, selection: TextSelection.collapsed(offset: cursorPosition + emote.text!.length), @@ -261,7 +262,8 @@ class _WhisperDetailPageState extends State label: '私信输入框', child: TextField( style: Theme.of(context).textTheme.titleMedium, - controller: _replyContentController, + controller: + _whisperDetailController.replyContentController, autofocus: false, focusNode: replyContentFocusNode, decoration: const InputDecoration(