mod: handle dispose

This commit is contained in:
bggRGjQaUbCoE
2024-08-29 17:45:41 +08:00
parent 536a2177c7
commit 33a4b408e1
43 changed files with 274 additions and 150 deletions

View File

@@ -33,6 +33,7 @@ class AnimatedDialogState extends State<AnimatedDialog>
@override
void dispose() {
controller!.removeListener(() {});
controller!.dispose();
super.dispose();
}

View File

@@ -26,7 +26,6 @@ class _BangumiPageState extends State<BangumiPage>
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<BangumiPage>
@override
void initState() {
super.initState();
scrollController = _bangumiController.scrollController;
StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream;
StreamController<bool> searchBarStream =
Get.find<HomeController>().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<BangumiPage>
}
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<BangumiPage>
@override
void dispose() {
scrollController.removeListener(() {});
_bangumiController.scrollController.removeListener(() {});
_bangumiController.scrollController.dispose();
super.dispose();
}

View File

@@ -48,6 +48,7 @@ class _BlackListPageState extends State<BlackListPage> {
_blackListController.blackList.map<int>((e) => e.mid!).toList();
localCache.put(LocalCacheKey.blackMidsList, blackMidsList);
scrollController.removeListener(() {});
scrollController.dispose();
super.dispose();
}

View File

@@ -182,8 +182,9 @@ class _DynamicDetailPageState extends State<DynamicDetailPage>
@override
void dispose() {
scrollController.removeListener(() {});
titleStreamC.close();
fabAnimationCtr.dispose();
scrollController.removeListener(() {});
scrollController.dispose();
super.dispose();
}

View File

@@ -26,7 +26,6 @@ class _DynamicsPageState extends State<DynamicsPage>
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<DynamicsPage>
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<DynamicsPage>
void dispose() {
_dynamicsController.tabController.removeListener(() {});
_dynamicsController.tabController.dispose();
_dynamicsController.scrollController.removeListener(() {});
_dynamicsController.scrollController.dispose();
super.dispose();
}
@@ -96,8 +97,8 @@ class _DynamicsPageState extends State<DynamicsPage>
}
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();
}

View File

@@ -44,6 +44,7 @@ class _FansPageState extends State<FansPage> {
@override
void dispose() {
scrollController.removeListener(() {});
scrollController.dispose();
super.dispose();
}

View File

@@ -38,6 +38,13 @@ class _FavPageState extends State<FavPage> {
);
}
@override
void dispose() {
scrollController.removeListener(() {});
scrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(

View File

@@ -54,6 +54,8 @@ class _FavDetailPageState extends State<FavDetailPage> {
@override
void dispose() {
titleStreamC.close();
_controller.removeListener(() {});
_controller.dispose();
super.dispose();
}

View File

@@ -16,18 +16,16 @@ class FavSearchPage extends StatefulWidget {
class _FavSearchPageState extends State<FavSearchPage> {
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<FavSearchPage> {
@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<FavSearchPage> {
)
: _favSearchCtr.favList.isNotEmpty
? ListView.builder(
controller: scrollController,
controller: _favSearchCtr.scrollController,
itemCount: _favSearchCtr.favList.length + 1,
itemBuilder: (context, index) {
if (index == _favSearchCtr.favList.length) {

View File

@@ -14,7 +14,6 @@ class FollowPage extends StatefulWidget {
class _FollowPageState extends State<FollowPage> {
late String mid;
late FollowController _followController;
final ScrollController scrollController = ScrollController();
@override
void initState() {
@@ -39,10 +38,9 @@ class _FollowPageState extends State<FollowPage> {
),
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) => <PopupMenuEntry>[

View File

@@ -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<FollowSearchPage> {
late Future? _futureBuilder;
final ScrollController scrollController = ScrollController();
@override
void dispose() {
_followSearchController.searchFocusNode.dispose();
scrollController.removeListener(() {});
scrollController.dispose();
super.dispose();
}
@override
void initState() {
super.initState();

View File

@@ -61,6 +61,7 @@ class _HistoryPageState extends State<HistoryPage> {
@override
void dispose() {
scrollController.removeListener(() {});
scrollController.dispose();
super.dispose();
}

View File

@@ -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) {

View File

@@ -26,7 +26,6 @@ class _HotPageState extends State<HotPage> 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<HotPage> with AutomaticKeepAliveClientMixin {
void initState() {
super.initState();
_futureBuilderFuture = _hotController.queryHotFeed('init');
scrollController = _hotController.scrollController;
StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream;
StreamController<bool> searchBarStream =
Get.find<HomeController>().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<HotPage> 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<HotPage> with AutomaticKeepAliveClientMixin {
@override
void dispose() {
scrollController.removeListener(() {});
_hotController.scrollController.removeListener(() {});
_hotController.scrollController.dispose();
super.dispose();
}

View File

@@ -54,6 +54,14 @@ class _HtmlRenderPageState extends State<HtmlRenderPage>
scrollListener();
}
@override
void dispose() {
fabAnimationCtr.dispose();
scrollController.removeListener(() {});
scrollController.dispose();
super.dispose();
}
void scrollListener() {
scrollController = _htmlRenderCtr.scrollController;
scrollController.addListener(

View File

@@ -27,7 +27,6 @@ class _LivePageState extends State<LivePage>
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<LivePage>
void initState() {
super.initState();
_futureBuilderFuture = _liveController.queryLiveList('init');
scrollController = _liveController.scrollController;
StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream;
StreamController<bool> searchBarStream =
Get.find<HomeController>().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<LivePage>
}
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<LivePage>
@override
void dispose() {
scrollController.removeListener(() {});
_liveController.scrollController.removeListener(() {});
_liveController.scrollController.dispose();
super.dispose();
}

View File

@@ -45,7 +45,7 @@ class _LiveRoomPageState extends State<LiveRoomPage> {
@override
void dispose() {
floating?.dispose();
plPlayerController!.dispose();
plPlayerController?.dispose();
super.dispose();
}
@@ -176,7 +176,7 @@ class _LiveRoomPageState extends State<LiveRoomPage> {
),
//内置浏览器打开
IconButton(
tooltip: '内置浏览器打开',
tooltip: '内置浏览器打开',
onPressed: () {
Get.offNamed(
'/webview',

View File

@@ -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: <Widget>[
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) {

View File

@@ -25,6 +25,7 @@ class _LoginPageState extends State<LoginPage> {
// 二维码生成时间
bool showPassword = false;
GlobalKey globalKey = GlobalKey();
@override
void initState() {
super.initState();
@@ -33,6 +34,10 @@ class _LoginPageState extends State<LoginPage> {
@override
void dispose() {
_loginPageCtr.dispose();
_loginPageCtr.telTextController.dispose();
_loginPageCtr.usernameTextController.dispose();
_loginPageCtr.passwordTextController.dispose();
_loginPageCtr.smsCodeTextController.dispose();
super.dispose();
}

View File

@@ -55,6 +55,7 @@ class _MediaPageState extends State<MediaPage>
@override
void dispose() {
mediaController.scrollController.removeListener(() {});
mediaController.scrollController.dispose();
super.dispose();
}

View File

@@ -18,9 +18,15 @@ class MemberArchivePage extends StatefulWidget {
class _MemberArchivePageState extends State<MemberArchivePage> {
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<MemberArchivePage> {
_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();

View File

@@ -21,7 +21,6 @@ class MemberDynamicsPage extends StatefulWidget {
class _MemberDynamicsPageState extends State<MemberDynamicsPage> {
late MemberDynamicsController _memberDynamicController;
late Future _futureBuilderFuture;
late ScrollController scrollController;
late int mid;
late bool dynamicsWaterfallFlow;
@@ -34,11 +33,11 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage> {
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<MemberDynamicsPage> {
@override
void dispose() {
_memberDynamicController.scrollController.removeListener(() {});
_memberDynamicController.scrollController.dispose();
super.dispose();
}

View File

@@ -44,6 +44,9 @@ class _MemberSearchPageState extends State<MemberSearchPage>
@override
void dispose() {
// _tabController.dispose();
_memberSearchCtr.searchFocusNode.dispose();
scrollController.removeListener(() {});
scrollController.dispose();
super.dispose();
}

View File

@@ -17,18 +17,24 @@ class _MemberSeasonsPageState extends State<MemberSeasonsPage> {
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();

View File

@@ -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';

View File

@@ -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<AtMePage> {
_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<AtMePage> {
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));
}

View File

@@ -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<LikeMePage> {
_scrollController.addListener(_scrollListener);
}
@override
void dispose() {
_scrollController.removeListener(_scrollListener);
_scrollController.dispose();
super.dispose();
}
Future _scrollListener() async {
if (_scrollController.position.pixels >=
_scrollController.position.maxScrollExtent - 200) {

View File

@@ -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<ReplyMePage> {
_scrollController.addListener(_scrollListener);
}
@override
void dispose() {
_scrollController.removeListener(_scrollListener);
_scrollController.dispose();
super.dispose();
}
Future _scrollListener() async {
if (_scrollController.position.pixels >=
_scrollController.position.maxScrollExtent - 200) {

View File

@@ -24,6 +24,13 @@ class _SysMsgPageState extends State<SysMsgPage> {
_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<SysMsgPage> {
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<SysMsgPage> {
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(

View File

@@ -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';

View File

@@ -28,7 +28,6 @@ class _ZonePageState extends State<ZonePage>
with AutomaticKeepAliveClientMixin {
late ZoneController _zoneController;
Future? _futureBuilderFuture;
late ScrollController scrollController;
@override
bool get wantKeepAlive => true;
@@ -38,15 +37,14 @@ class _ZonePageState extends State<ZonePage>
super.initState();
_zoneController = Get.put(ZoneController(), tag: widget.rid.toString());
_futureBuilderFuture = _zoneController.queryRankFeed('init', widget.rid);
scrollController = _zoneController.scrollController;
StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream;
StreamController<bool> searchBarStream =
Get.find<HomeController>().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<ZonePage>
}
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<ZonePage>
@override
void dispose() {
scrollController.removeListener(() {});
_zoneController.scrollController.removeListener(() {});
_zoneController.scrollController.dispose();
super.dispose();
}
@@ -80,12 +79,12 @@ class _ZonePageState extends State<ZonePage>
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) {

View File

@@ -65,6 +65,7 @@ class _RcmdPageState extends State<RcmdPage>
@override
void dispose() {
_rcmdController.scrollController.removeListener(() {});
_rcmdController.scrollController.dispose();
super.dispose();
}

View File

@@ -25,6 +25,12 @@ class _SearchPageState extends State<SearchPage> with RouteAware {
_futureBuilderFuture = _searchController.queryHotSearchList();
}
@override
void dispose() {
_searchController.searchFocusNode.dispose();
super.dispose();
}
@override
// 返回当前页面时
void didPopNext() async {

View File

@@ -32,7 +32,6 @@ class _SearchPanelState extends State<SearchPanel>
late SearchPanelController _searchPanelController;
late Future _futureBuilderFuture;
late ScrollController scrollController;
@override
bool get wantKeepAlive => true;
@@ -47,10 +46,10 @@ class _SearchPanelState extends State<SearchPanel>
),
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<SearchPanel>
@override
void dispose() {
scrollController.removeListener(() {});
_searchPanelController.scrollController.removeListener(() {});
_searchPanelController.scrollController.dispose();
super.dispose();
}

View File

@@ -14,7 +14,7 @@ class SearchResultPage extends StatefulWidget {
class _SearchResultPageState extends State<SearchResultPage>
with TickerProviderStateMixin {
late SearchResultController? _searchResultController;
late TabController? _tabController;
late TabController _tabController;
@override
void initState() {
@@ -29,6 +29,12 @@ class _SearchResultPageState extends State<SearchResultPage>
);
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(

View File

@@ -32,6 +32,13 @@ class _SetDisplayModeState extends State<SetDisplayMode> {
});
}
@override
void dispose() {
controller.removeListener(() {});
controller.dispose();
super.dispose();
}
// 获取所有的mode
Future<void> fetchAll() async {
preferred = await FlutterDisplayMode.preferred;

View File

@@ -17,17 +17,22 @@ class SubPage extends StatefulWidget {
class _SubPageState extends State<SubPage> {
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<SubPage> {
Map? data = snapshot.data;
if (data != null && data['status']) {
return Obx(() => CustomScrollView(
controller: scrollController,
controller: _subController.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverGrid(

View File

@@ -54,6 +54,8 @@ class _SubDetailPageState extends State<SubDetailPage> {
@override
void dispose() {
titleStreamC.close();
_controller.removeListener(() {});
_controller.dispose();
super.dispose();
}

View File

@@ -67,6 +67,14 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
scrollListener();
}
@override
void dispose() {
fabAnimationCtr.dispose();
scrollController.removeListener(() {});
scrollController.dispose();
super.dispose();
}
void scrollListener() {
scrollController = _videoReplyController.scrollController;
scrollController.addListener(

View File

@@ -33,9 +33,7 @@ class VideoReplyReplyPanel extends StatefulWidget {
class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel> {
late VideoReplyReplyController _videoReplyReplyController;
late AnimationController replyAnimationCtl;
Future? _futureBuilderFuture;
late ScrollController scrollController;
@override
void initState() {
@@ -46,11 +44,12 @@ class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel> {
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<VideoReplyReplyPanel> {
@override
void dispose() {
// scrollController.dispose();
_videoReplyReplyController.scrollController.removeListener(() {});
_videoReplyReplyController.scrollController.dispose();
super.dispose();
}

View File

@@ -262,6 +262,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
@override
void dispose() {
appbarStream.close();
floating.dispose();
videoDetailController.floating?.dispose();
videoIntroController.videoDetail.close();

View File

@@ -28,6 +28,13 @@ class _WhisperPageState extends State<WhisperPage> {
_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<WhisperPage> {
width: 45,
height: 45,
type: 'avatar',
src: sessionList[i].accountInfo?.face ?? "",
src: sessionList[i].accountInfo?.face ??
"",
),
),
title: Text(

View File

@@ -22,7 +22,6 @@ class _WhisperDetailPageState extends State<WhisperDetailPage>
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<WhisperDetailPage>
super.initState();
WidgetsBinding.instance.addObserver(this);
_whisperDetailController.querySessionMsg();
_replyContentController = _whisperDetailController.replyContentController;
_focusListener();
}
@@ -82,17 +80,20 @@ class _WhisperDetailPageState extends State<WhisperDetailPage>
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<WhisperDetailPage>
label: '私信输入框',
child: TextField(
style: Theme.of(context).textTheme.titleMedium,
controller: _replyContentController,
controller:
_whisperDetailController.replyContentController,
autofocus: false,
focusNode: replyContentFocusNode,
decoration: const InputDecoration(