diff --git a/lib/pages/common/common_controller.dart b/lib/pages/common/common_controller.dart index a6e40e202..678b9f31d 100644 --- a/lib/pages/common/common_controller.dart +++ b/lib/pages/common/common_controller.dart @@ -8,6 +8,7 @@ abstract class CommonController extends GetxController { int currentPage = 1; bool isLoading = false; + bool isEnd = false; Rx loadingState = LoadingState.loading().obs; Future customGetData(); @@ -23,7 +24,7 @@ abstract class CommonController extends GetxController { void handleSuccess(List currentList, List dataList) {} Future queryData([bool isRefresh = true]) async { - if (isLoading) return; + if (isLoading || (isRefresh.not && isEnd)) return; isLoading = true; LoadingState response = await customGetData(); if (response is Success) { @@ -50,6 +51,7 @@ abstract class CommonController extends GetxController { Future onRefresh() async { currentPage = 1; + isEnd = false; await queryData(); } diff --git a/lib/pages/common/reply_controller.dart b/lib/pages/common/reply_controller.dart index 6745ebebc..dfdf03b42 100644 --- a/lib/pages/common/reply_controller.dart +++ b/lib/pages/common/reply_controller.dart @@ -3,7 +3,6 @@ import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/models/common/reply_type.dart'; import 'package:PiliPalaX/pages/common/common_controller.dart'; import 'package:PiliPalaX/pages/video/detail/reply_new/reply_page.dart'; -import 'package:PiliPalaX/utils/extension.dart'; import 'package:PiliPalaX/utils/utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; @@ -17,7 +16,6 @@ import 'package:get/get_navigation/src/dialog/dialog_route.dart'; abstract class ReplyController extends CommonController { String nextOffset = ""; bool isLoadingMore = false; - RxString noMore = ''.obs; RxInt count = (-1).obs; // 当前回复的回复 ReplyItemModel? currentReplyItem; @@ -52,16 +50,9 @@ abstract class ReplyController extends CommonController { Future onRefresh() { cursor = null; nextOffset = ''; - noMore.value = ''; return super.onRefresh(); } - @override - Future queryData([bool isRefresh = true]) { - if (isRefresh.not && noMore.value == '没有更多了') return Future.value(); - return super.queryData(isRefresh); - } - @override bool customHandleResponse(Success response) { MainListReply replies = response.response; @@ -79,15 +70,9 @@ abstract class ReplyController extends CommonController { : []; replies.replies.insertAll(0, list); } - if (replies.replies.isNotEmpty) { - noMore.value = '加载中...'; - if (replies.cursor.isEnd || replies.replies.length >= count.value) { - noMore.value = '没有更多了'; - } - } else { - // 未登录状态replies可能返回null - noMore.value = currentPage == 1 ? '还没有评论' : '没有更多了'; - } + isEnd = replies.replies.isEmpty || + replies.cursor.isEnd || + replies.replies.length >= count.value; loadingState.value = LoadingState.success(replies); return true; } @@ -110,7 +95,6 @@ abstract class ReplyController extends CommonController { sortTypeTitle.value = sortType.titles; sortTypeLabel.value = sortType.labels; nextOffset = ""; - noMore.value = ''; loadingState.value = LoadingState.loading(); onRefresh(); }); @@ -170,6 +154,7 @@ abstract class ReplyController extends CommonController { } else { response.replies[index].replies.add(replyInfo); } + count.value += 1; loadingState.value = LoadingState.success(response); } }, @@ -191,6 +176,7 @@ abstract class ReplyController extends CommonController { } }).toList(); } + count.value -= 1; loadingState.value = LoadingState.success(response); } } diff --git a/lib/pages/dynamics/detail/view.dart b/lib/pages/dynamics/detail/view.dart index 97948385f..a998e03d4 100644 --- a/lib/pages/dynamics/detail/view.dart +++ b/lib/pages/dynamics/detail/view.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:PiliPalaX/common/widgets/refresh_indicator.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/video/detail/reply/widgets/reply_item_grpc.dart'; +import 'package:PiliPalaX/utils/extension.dart'; import 'package:PiliPalaX/utils/utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; @@ -376,18 +377,19 @@ class _DynamicDetailPageState extends State (context, index) { if (index == loadingState.response.replies.length) { return Container( + alignment: Alignment.center, padding: EdgeInsets.only( bottom: MediaQuery.of(context).padding.bottom), height: MediaQuery.of(context).padding.bottom + 100, - child: Center( - child: Obx( - () => Text( - _dynamicDetailController.noMore.value, - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.outline, - ), - ), + child: Text( + _dynamicDetailController.isEnd.not + ? '加载中...' + : loadingState.response.replies.isEmpty + ? '还没有评论' + : '没有更多了', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).colorScheme.outline, ), ), ); diff --git a/lib/pages/fan/controller.dart b/lib/pages/fan/controller.dart index 87a00d4d3..6711af1ff 100644 --- a/lib/pages/fan/controller.dart +++ b/lib/pages/fan/controller.dart @@ -1,7 +1,6 @@ import 'package:PiliPalaX/http/fan.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/common/common_controller.dart'; -import 'package:PiliPalaX/utils/extension.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:PiliPalaX/utils/storage.dart'; @@ -14,7 +13,6 @@ class FansController extends CommonController { late String? name; dynamic userInfo; RxBool isOwner = false.obs; - bool isEnd = false; @override void onInit() { @@ -29,20 +27,6 @@ class FansController extends CommonController { queryData(); } - @override - Future onRefresh() { - isEnd = false; - return super.onRefresh(); - } - - @override - Future queryData([bool isRefresh = true]) { - if (isRefresh.not && isEnd) { - return Future.value(); - } - return super.queryData(isRefresh); - } - @override bool customHandleResponse(Success response) { if ((currentPage == 1 && response.response.total < ps) || diff --git a/lib/pages/html/view.dart b/lib/pages/html/view.dart index eeea6d4ce..0b00c15ff 100644 --- a/lib/pages/html/view.dart +++ b/lib/pages/html/view.dart @@ -4,6 +4,7 @@ import 'package:PiliPalaX/common/widgets/article_content.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/video/detail/reply/widgets/reply_item_grpc.dart'; +import 'package:PiliPalaX/utils/extension.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -334,18 +335,19 @@ class _HtmlRenderPageState extends State itemBuilder: (context, index) { if (index == loadingState.response.replies.length) { return Container( + alignment: Alignment.center, padding: EdgeInsets.only( bottom: MediaQuery.of(context).padding.bottom), height: MediaQuery.of(context).padding.bottom + 100, - child: Center( - child: Obx( - () => Text( - _htmlRenderCtr.noMore.value, - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.outline, - ), - ), + child: Text( + _htmlRenderCtr.isEnd.not + ? '加载中...' + : loadingState.response.replies.isEmpty + ? '还没有评论' + : '没有更多了', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).colorScheme.outline, ), ), ); diff --git a/lib/pages/member/new/content/member_contribute/content/article/member_article_ctr.dart b/lib/pages/member/new/content/member_contribute/content/article/member_article_ctr.dart index cbf37724f..ff0f902b6 100644 --- a/lib/pages/member/new/content/member_contribute/content/article/member_article_ctr.dart +++ b/lib/pages/member/new/content/member_contribute/content/article/member_article_ctr.dart @@ -2,7 +2,6 @@ import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/http/member.dart'; import 'package:PiliPalaX/models/space_article/data.dart'; import 'package:PiliPalaX/pages/common/common_controller.dart'; -import 'package:PiliPalaX/utils/extension.dart'; class MemberArticleCtr extends CommonController { MemberArticleCtr({ @@ -11,7 +10,6 @@ class MemberArticleCtr extends CommonController { final int mid; - bool isEnd = false; int count = -1; @override @@ -20,18 +18,6 @@ class MemberArticleCtr extends CommonController { queryData(); } - @override - Future onRefresh() async { - isEnd = false; - return super.onRefresh(); - } - - @override - Future queryData([bool isRefresh = true]) { - if (isRefresh.not && isEnd) return Future.value(); - return super.queryData(isRefresh); - } - @override bool customHandleResponse(Success response) { Data data = response.response; diff --git a/lib/pages/member/new/content/member_contribute/content/bangumi/member_bangumi_ctr.dart b/lib/pages/member/new/content/member_contribute/content/bangumi/member_bangumi_ctr.dart index 26f8b47dc..cbc8465f8 100644 --- a/lib/pages/member/new/content/member_contribute/content/bangumi/member_bangumi_ctr.dart +++ b/lib/pages/member/new/content/member_contribute/content/bangumi/member_bangumi_ctr.dart @@ -5,7 +5,6 @@ import 'package:PiliPalaX/pages/common/common_controller.dart'; import 'package:PiliPalaX/pages/member/new/content/member_contribute/member_contribute.dart' show ContributeType; import 'package:PiliPalaX/pages/member/new/controller.dart'; -import 'package:PiliPalaX/utils/extension.dart'; import 'package:get/get.dart'; class MemberBangumiCtr extends CommonController { @@ -16,7 +15,6 @@ class MemberBangumiCtr extends CommonController { final int mid; final String? heroTag; - bool isEnd = false; late final int count; late final _ctr = Get.find(tag: heroTag); @@ -32,17 +30,10 @@ class MemberBangumiCtr extends CommonController { @override Future onRefresh() async { - isEnd = false; currentPage = 1; await queryData(); } - @override - Future queryData([bool isRefresh = true]) { - if (isRefresh.not && isEnd) return Future.value(); - return super.queryData(isRefresh); - } - @override bool customHandleResponse(Success response) { Data data = response.response; diff --git a/lib/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart b/lib/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart index 359391c31..568dcba08 100644 --- a/lib/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart +++ b/lib/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart @@ -4,7 +4,6 @@ import 'package:PiliPalaX/models/space_archive/data.dart'; import 'package:PiliPalaX/pages/common/common_controller.dart'; import 'package:PiliPalaX/pages/member/new/content/member_contribute/member_contribute.dart' show ContributeType; -import 'package:PiliPalaX/utils/extension.dart'; import 'package:get/get.dart'; class MemberVideoCtr extends CommonController { @@ -22,13 +21,11 @@ class MemberVideoCtr extends CommonController { String? aid; RxString order = 'pubdate'.obs; RxString sort = 'desc'.obs; - bool isEnd = false; RxInt count = (-1).obs; int? next; @override Future onRefresh() async { - isEnd = false; aid = null; next = null; currentPage = 0; @@ -42,12 +39,6 @@ class MemberVideoCtr extends CommonController { queryData(); } - @override - Future queryData([bool isRefresh = true]) { - if (isRefresh.not && isEnd) return Future.value(); - return super.queryData(isRefresh); - } - @override bool customHandleResponse(Success response) { Data data = response.response; diff --git a/lib/pages/member/new/content/member_dynamic/member_dynamic_ctr.dart b/lib/pages/member/new/content/member_dynamic/member_dynamic_ctr.dart index b39ae1ad7..65f2dcf9c 100644 --- a/lib/pages/member/new/content/member_dynamic/member_dynamic_ctr.dart +++ b/lib/pages/member/new/content/member_dynamic/member_dynamic_ctr.dart @@ -2,32 +2,12 @@ import 'package:PiliPalaX/grpc/app/dynamic/v2/dynamic.pb.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/http/member.dart'; import 'package:PiliPalaX/pages/common/common_controller.dart'; -import 'package:PiliPalaX/utils/extension.dart'; class MemberDynamicCtr extends CommonController { MemberDynamicCtr({ required this.mid, }); int mid; - bool isEnd = false; - - @override - void onInit() { - super.onInit(); - // queryData(); - } - - @override - Future onRefresh() { - isEnd = false; - return super.onRefresh(); - } - - @override - Future queryData([bool isRefresh = true]) { - if (isRefresh.not && isEnd) return Future.value(); - return super.queryData(isRefresh); - } @override bool customHandleResponse(Success response) { diff --git a/lib/pages/video/detail/reply/view.dart b/lib/pages/video/detail/reply/view.dart index f7338a36d..9bfe31c06 100644 --- a/lib/pages/video/detail/reply/view.dart +++ b/lib/pages/video/detail/reply/view.dart @@ -2,6 +2,7 @@ import 'package:PiliPalaX/common/widgets/refresh_indicator.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/video/detail/reply/widgets/reply_item_grpc.dart'; +import 'package:PiliPalaX/utils/extension.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -215,17 +216,18 @@ class _VideoReplyPanelState extends State _videoReplyController.onLoadMore(); }); return Container( + alignment: Alignment.center, padding: EdgeInsets.only(bottom: bottom), height: bottom + 100, - child: Center( - child: Obx( - () => Text( - _videoReplyController.noMore.value, - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.outline, - ), - ), + child: Text( + _videoReplyController.isEnd.not + ? '加载中...' + : loadingState.response.replies.isEmpty + ? '还没有评论' + : '没有更多了', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).colorScheme.outline, ), ), ); diff --git a/lib/pages/video/detail/reply_reply/controller.dart b/lib/pages/video/detail/reply_reply/controller.dart index d207d3568..db3b0db21 100644 --- a/lib/pages/video/detail/reply_reply/controller.dart +++ b/lib/pages/video/detail/reply_reply/controller.dart @@ -2,7 +2,6 @@ import 'package:PiliPalaX/grpc/app/main/community/reply/v1/reply.pb.dart'; import 'package:PiliPalaX/grpc/grpc_repo.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/common/common_controller.dart'; -import 'package:PiliPalaX/utils/extension.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPalaX/http/reply.dart'; @@ -44,8 +43,6 @@ class VideoReplyReplyController extends CommonController ReplyInfo? firstFloor; - bool isEnd = false; - @override void onInit() { super.onInit(); @@ -82,7 +79,6 @@ class VideoReplyReplyController extends CommonController @override Future queryData([bool isRefresh = true]) async { - if (isRefresh.not && isEnd) return Future.value(); if (!isDialogue && currentPage == 1 && !hasRoot && @@ -110,7 +106,6 @@ class VideoReplyReplyController extends CommonController @override Future onRefresh() { cursor = null; - isEnd = false; return super.onRefresh(); } @@ -159,24 +154,13 @@ class VideoReplyReplyController extends CommonController } } if (isDialogue) { - if (replies.replies.isNotEmpty) { - if (replies.cursor.isEnd || replies.replies.length >= count.value) { - isEnd = true; - } - } else { - // 未登录状态replies可能返回null - isEnd = true; - } + isEnd = replies.replies.isEmpty || + replies.cursor.isEnd || + replies.replies.length >= count.value; } else { - if (replies.root.replies.isNotEmpty) { - if (replies.cursor.isEnd || - replies.root.replies.length >= count.value) { - isEnd = true; - } - } else { - // 未登录状态replies可能返回null - isEnd = true; - } + isEnd = replies.root.replies.isEmpty || + replies.cursor.isEnd || + replies.root.replies.length >= count.value; } if (isDialogue) { loadingState.value = LoadingState.success(replies.replies); diff --git a/lib/pages/video/detail/reply_reply/view.dart b/lib/pages/video/detail/reply_reply/view.dart index 64d46484d..0d0f9943b 100644 --- a/lib/pages/video/detail/reply_reply/view.dart +++ b/lib/pages/video/detail/reply_reply/view.dart @@ -149,9 +149,9 @@ class _VideoReplyReplyPanelState extends State { physics: const AlwaysScrollableScrollPhysics(), itemBuilder: (_, index) { if (widget.isDialogue) { - return Obx(() => _buildBody( + return _buildBody( _videoReplyReplyController.loadingState.value, - index)); + index); } else if (firstFloor != null) { if (index == 0) { return ReplyItemGrpc( @@ -176,17 +176,17 @@ class _VideoReplyReplyPanelState extends State { } else if (index == 2) { return _sortWidget; } else { - return Obx(() => _buildBody( + return _buildBody( _videoReplyReplyController.loadingState.value, - index - 3)); + index - 3); } } else { if (index == 0) { return _sortWidget; } else { - return Obx(() => _buildBody( + return _buildBody( _videoReplyReplyController.loadingState.value, - index - 1)); + index - 1); } } }, @@ -285,6 +285,7 @@ class _VideoReplyReplyPanelState extends State { ?.response ?? []; list.insert(index + 1, replyInfo); + _videoReplyReplyController.count.value += 1; _videoReplyReplyController.loadingState.value = LoadingState.success(list); } @@ -314,22 +315,19 @@ class _VideoReplyReplyPanelState extends State { _videoReplyReplyController.onLoadMore(); }); return Container( + alignment: Alignment.center, padding: EdgeInsets.only( bottom: MediaQuery.of(context).padding.bottom), height: MediaQuery.of(context).padding.bottom + 100, - child: Center( - child: Obx( - () => Text( - _videoReplyReplyController.isEnd.not - ? '加载中...' - : loadingState.response.isEmpty - ? '还没有评论' - : '没有更多了', - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.outline, - ), - ), + child: Text( + _videoReplyReplyController.isEnd.not + ? '加载中...' + : loadingState.response.isEmpty + ? '还没有评论' + : '没有更多了', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).colorScheme.outline, ), ), ); @@ -376,6 +374,7 @@ class _VideoReplyReplyPanelState extends State { List list = (_videoReplyReplyController.loadingState.value as Success).response; list = list.where((item) => item.id != rpid).toList(); + _videoReplyReplyController.count.value -= 1; _videoReplyReplyController.loadingState.value = LoadingState.success(list); },