From 041af37bb0c27644594c644328e428bfe5fe0699 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Fri, 2 Jan 2026 12:05:31 +0800 Subject: [PATCH] tweaks Signed-off-by: bggRGjQaUbCoE --- lib/http/download.dart | 21 +- lib/pages/article/controller.dart | 31 +- lib/pages/audio/controller.dart | 44 ++- lib/pages/blacklist/view.dart | 8 +- lib/pages/common/common_data_controller.dart | 13 +- lib/pages/common/common_intro_controller.dart | 10 +- lib/pages/common/common_list_controller.dart | 19 +- .../common/common_whisper_controller.dart | 7 +- lib/pages/common/multi_select/base.dart | 9 +- lib/pages/common/reply_controller.dart | 18 +- lib/pages/danmaku/controller.dart | 10 +- lib/pages/danmaku_block/controller.dart | 28 +- lib/pages/dynamics/controller.dart | 23 +- .../dynamics/widgets/rich_node_panel.dart | 12 +- lib/pages/dynamics/widgets/vote.dart | 21 +- .../dynamics_create_reserve/controller.dart | 12 +- .../dynamics_create_vote/controller.dart | 26 +- lib/pages/dynamics_detail/controller.dart | 6 +- lib/pages/dynamics_topic/controller.dart | 4 +- lib/pages/dynamics_topic/view.dart | 343 +++++++++--------- lib/pages/episode_panel/view.dart | 6 +- lib/pages/fav/pgc/controller.dart | 32 +- lib/pages/fav/view.dart | 14 +- lib/pages/fav_detail/controller.dart | 25 +- lib/pages/fav_sort/view.dart | 8 +- lib/pages/follow/child/child_controller.dart | 4 +- lib/pages/follow/controller.dart | 4 +- lib/pages/history/controller.dart | 6 +- lib/pages/live/controller.dart | 9 +- lib/pages/live_area/controller.dart | 4 +- lib/pages/live_area/view.dart | 54 +-- lib/pages/live_dm_block/controller.dart | 13 +- lib/pages/live_room/controller.dart | 35 +- lib/pages/login/controller.dart | 4 +- .../login/geetest/geetest_webview_dialog.dart | 4 +- lib/pages/match_info/view.dart | 38 +- lib/pages/member_video/controller.dart | 14 +- lib/pages/mine/controller.dart | 13 +- .../msg_feed_top/like_me/controller.dart | 9 +- lib/pages/music/controller.dart | 4 +- lib/pages/music/view.dart | 44 +-- lib/pages/pgc/controller.dart | 12 +- lib/pages/pgc_index/controller.dart | 11 +- lib/pages/popular_series/controller.dart | 9 +- lib/pages/rcmd/controller.dart | 20 +- lib/pages/setting/models/extra_settings.dart | 5 +- lib/pages/setting/models/style_settings.dart | 2 + lib/pages/setting/pages/font_size_select.dart | 2 +- lib/pages/space_setting/controller.dart | 25 +- lib/pages/video/controller.dart | 13 +- .../video/introduction/ugc/controller.dart | 92 +++-- lib/pages/video/member/controller.dart | 14 +- .../video/reply/widgets/reply_item_grpc.dart | 6 +- lib/pages/video/widgets/header_control.dart | 15 +- lib/pages/whisper/controller.dart | 4 +- lib/pages/whisper_detail/controller.dart | 6 +- .../whisper_link_setting/controller.dart | 4 +- lib/pages/whisper_link_setting/view.dart | 11 +- lib/pages/whisper_settings/controller.dart | 3 +- lib/router/app_pages.dart | 195 ++++------ lib/services/download/download_service.dart | 5 +- lib/utils/image_utils.dart | 22 +- lib/utils/login_utils.dart | 17 +- lib/utils/page_utils.dart | 71 ++-- lib/utils/reply_utils.dart | 12 +- lib/utils/request_utils.dart | 26 +- pubspec.lock | 2 +- 67 files changed, 775 insertions(+), 838 deletions(-) diff --git a/lib/http/download.dart b/lib/http/download.dart index a3d4cac56..63364c6b6 100644 --- a/lib/http/download.dart +++ b/lib/http/download.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/common/account_type.dart'; import 'package:PiliPlus/models/common/video/audio_quality.dart'; @@ -37,18 +38,17 @@ abstract final class DownloadHttp { _ => VideoType.ugc, }, ); - if (res.isSuccess) { - final PlayUrlModel data = res.data; - final Dash? dash = data.dash; + if (res case Success(:final response)) { + final Dash? dash = response.dash; if (dash != null) { final List videoList = dash.video!; final curHighestVideoQa = videoList.first.quality.code; final preferVideoQa = entry.preferedVideoQuality; int targetVideoQa = curHighestVideoQa; - if (data.acceptQuality?.isNotEmpty == true && + if (response.acceptQuality?.isNotEmpty == true && preferVideoQa <= curHighestVideoQa) { // 如果预设的画质低于当前最高 - targetVideoQa = data.acceptQuality!.findClosestTarget( + targetVideoQa = response.acceptQuality!.findClosestTarget( (e) => e <= preferVideoQa, (a, b) => a > b ? a : b, ); @@ -60,7 +60,7 @@ abstract final class DownloadHttp { .toList(); /// 优先顺序 设置中指定解码格式 -> 当前可选的首个解码格式 - final List supportFormats = data.supportFormats!; + final List supportFormats = response.supportFormats!; // 根据画质选编码格式 final FormatItem targetSupportFormats = supportFormats.firstWhere( (e) => e.quality == targetVideoQa, @@ -170,7 +170,7 @@ abstract final class DownloadHttp { userAgent: userAgent, ); } else { - final first = data.durl!.first; + final first = response.durl!.first; final List segmentList = [ Type1Segment( backupUrls: [], @@ -182,9 +182,8 @@ abstract final class DownloadHttp { url: VideoUtils.getCdnUrl(first.playUrls), ), ]; - final FormatItem? formatItem = data.supportFormats?.firstWhereOrNull( - (e) => e.quality == data.quality, - ); + final FormatItem? formatItem = response.supportFormats + ?.firstWhereOrNull((e) => e.quality == response.quality); final String description = formatItem?.newDesc ?? VideoQuality.clear480.desc; final int targetVideoQa = @@ -223,7 +222,7 @@ abstract final class DownloadHttp { marlinToken: '', videoCodecId: 0, videoProject: true, - format: data.format!, + format: response.format!, playerError: 0, needVip: false, needLogin: false, diff --git a/lib/pages/article/controller.dart b/lib/pages/article/controller.dart index 1ee0d209b..716e94522 100644 --- a/lib/pages/article/controller.dart +++ b/lib/pages/article/controller.dart @@ -83,28 +83,27 @@ class ArticleController extends CommonDynController { Future queryOpus(String opusId) async { final res = await DynamicsHttp.opusDetail(opusId: opusId); - if (res.isSuccess) { - final opusData = res.data; + if (res case Success(:final response)) { //fallback - if (opusData.fallback?.id != null) { - id = opusData.fallback!.id!; + if (response.fallback?.id != null) { + id = response.fallback!.id!; type = 'read'; init(); return false; } - this.opusData = opusData; - commentType = opusData.basic!.commentType!; - commentId = int.parse(opusData.basic!.commentIdStr!); + opusData = response; + commentType = response.basic!.commentType!; + commentId = int.parse(response.basic!.commentIdStr!); if (showDynActionBar) { - if (opusData.modules.moduleStat != null) { - stats.value = opusData.modules.moduleStat; + if (response.modules.moduleStat != null) { + stats.value = response.modules.moduleStat; } else { getArticleInfo(); } } summary - ..author ??= opusData.modules.moduleAuthor - ..title ??= opusData.modules.moduleTag?.text; + ..author ??= response.modules.moduleAuthor + ..title ??= response.modules.moduleTag?.text; return true; } else { loadingState.value = res as Error; @@ -114,12 +113,12 @@ class ArticleController extends CommonDynController { Future queryRead(int cvid) async { final res = await DynamicsHttp.articleView(cvId: cvid); - if (res.isSuccess) { - articleData = res.data; + if (res case Success(:final response)) { + articleData = response; summary - ..author ??= articleData!.author - ..title ??= articleData!.title - ..cover ??= articleData!.originImageUrls?.firstOrNull; + ..author ??= response.author + ..title ??= response.title + ..cover ??= response.originImageUrls?.firstOrNull; if (showDynActionBar) { getArticleInfo(); diff --git a/lib/pages/audio/controller.dart b/lib/pages/audio/controller.dart index c8b77d04a..a8db88c4c 100644 --- a/lib/pages/audio/controller.dart +++ b/lib/pages/audio/controller.dart @@ -6,7 +6,6 @@ import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart' show DetailItem, PlayURLResp, - PlaylistResp, PlaylistSource, PlayInfo, ThumbUpReq_ThumbType, @@ -14,6 +13,7 @@ import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart' DashItem, ResponseUrl; import 'package:PiliPlus/http/constants.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/ua_type.dart'; import 'package:PiliPlus/pages/common/common_intro_controller.dart' show FavMixin; @@ -174,28 +174,27 @@ class AudioController extends GetxController extraId: extraId, order: order, ); - if (res.isSuccess) { - final PlaylistResp data = res.data; + if (res case Success(:final response)) { if (isInit) { - late final paginationReply = data.paginationReply; - _prev = data.reachStart ? null : paginationReply.prev; - _next = data.reachEnd ? null : paginationReply.next; - final index = data.list.indexWhere((e) => e.item.oid == oid); + late final paginationReply = response.paginationReply; + _prev = response.reachStart ? null : paginationReply.prev; + _next = response.reachEnd ? null : paginationReply.next; + final index = response.list.indexWhere((e) => e.item.oid == oid); if (index != -1) { this.index = index; - _updateCurrItem(data.list[index]); - playlist = data.list; + _updateCurrItem(response.list[index]); + playlist = response.list; } } else if (isLoadPrev) { - _prev = data.reachStart ? null : data.paginationReply.prev; - if (data.list.isNotEmpty) { - index += data.list.length; - playlist?.insertAll(0, data.list); + _prev = response.reachStart ? null : response.paginationReply.prev; + if (response.list.isNotEmpty) { + index += response.list.length; + playlist?.insertAll(0, response.list); } } else if (isLoadNext) { - _next = data.reachEnd ? null : data.paginationReply.next; - if (data.list.isNotEmpty) { - playlist?.addAll(data.list); + _next = response.reachEnd ? null : response.paginationReply.next; + if (response.list.isNotEmpty) { + playlist?.addAll(response.list); } } } else { @@ -209,8 +208,8 @@ class AudioController extends GetxController oid: oid, subId: subId, ); - if (res.isSuccess) { - _onPlay(res.data); + if (res case Success(:final response)) { + _onPlay(response); return true; } else { res.toast(); @@ -343,7 +342,7 @@ class AudioController extends GetxController ? ThumbUpReq_ThumbType.LIKE : ThumbUpReq_ThumbType.CANCEL_LIKE, ); - if (res.isSuccess) { + if (res case Success(:final response)) { hasLike.value = newVal; try { audioItem.value!.stat @@ -351,7 +350,7 @@ class AudioController extends GetxController ..like += newVal ? 1 : -1; audioItem.refresh(); } catch (_) {} - SmartDialog.showToast(res.data.message); + SmartDialog.showToast(response.message); } else { res.toast(); } @@ -368,10 +367,9 @@ class AudioController extends GetxController subId: subId, itemType: itemType, ); - if (res.isSuccess) { - final data = res.data; + if (res case Success(:final response)) { hasLike.value = true; - if (data.coinOk && !hasCoin) { + if (response.coinOk && !hasCoin) { coinNum.value = 2; GlobalData().afterCoin(2); try { diff --git a/lib/pages/blacklist/view.dart b/lib/pages/blacklist/view.dart index 25aff80b2..584e07bc2 100644 --- a/lib/pages/blacklist/view.dart +++ b/lib/pages/blacklist/view.dart @@ -24,12 +24,8 @@ class _BlackListPageState extends State { @override void dispose() { - if (_blackListController.loadingState.value.isSuccess) { - final blackMids = - _blackListController.loadingState.value.data - ?.map((e) => e.mid!) - .toSet() ?? - {}; + if (_blackListController.loadingState.value case Success(:final response)) { + final blackMids = response?.map((e) => e.mid!).toSet() ?? {}; GlobalData().blackMids = blackMids; Pref.blackMids = blackMids; } diff --git a/lib/pages/common/common_data_controller.dart b/lib/pages/common/common_data_controller.dart index 7c8111626..dbf0bb8cf 100644 --- a/lib/pages/common/common_data_controller.dart +++ b/lib/pages/common/common_data_controller.dart @@ -10,15 +10,14 @@ abstract class CommonDataController extends CommonController { Future queryData([bool isRefresh = true]) async { if (isLoading) return; isLoading = true; - LoadingState response = await customGetData(); - if (response is Success) { - if (!customHandleResponse(isRefresh, response)) { - loadingState.value = response as LoadingState; + final LoadingState res = await customGetData(); + if (res is Success) { + if (!customHandleResponse(isRefresh, res)) { + loadingState.value = res as LoadingState; } } else { - if (isRefresh && - !handleError(response is Error ? response.errMsg : null)) { - loadingState.value = response as LoadingState; + if (isRefresh && !handleError(res is Error ? res.errMsg : null)) { + loadingState.value = res as Error; } } isLoading = false; diff --git a/lib/pages/common/common_intro_controller.dart b/lib/pages/common/common_intro_controller.dart index f874235de..fc61f9cb3 100644 --- a/lib/pages/common/common_intro_controller.dart +++ b/lib/pages/common/common_intro_controller.dart @@ -168,19 +168,19 @@ mixin FavMixin on TripleMixin { Future> queryVideoInFolder() async { favIds = null; final (rid, type) = getFavRidType; - final result = await FavHttp.videoInFolder( + final res = await FavHttp.videoInFolder( mid: Accounts.main.mid, rid: rid, type: type, ); - if (result.isSuccess) { - favFolderData.value = result.data; - favIds = result.data.list + if (res case Success(:final response)) { + favFolderData.value = response; + favIds = response.list ?.where((item) => item.favState == 1) .map((item) => item.id) .toSet(); } - return result; + return res; } int get favFolderId { diff --git a/lib/pages/common/common_list_controller.dart b/lib/pages/common/common_list_controller.dart index ca4e6f6b3..296cc8d47 100644 --- a/lib/pages/common/common_list_controller.dart +++ b/lib/pages/common/common_list_controller.dart @@ -23,10 +23,10 @@ abstract class CommonListController extends CommonController { Future queryData([bool isRefresh = true]) async { if (isLoading || (!isRefresh && isEnd)) return; isLoading = true; - LoadingState response = await customGetData(); - if (response is Success) { - if (!customHandleResponse(isRefresh, response)) { - final dataList = getDataList(response.response); + final LoadingState res = await customGetData(); + if (res case Success(:final response)) { + if (!customHandleResponse(isRefresh, res)) { + final dataList = getDataList(response); if (dataList == null || dataList.isEmpty) { isEnd = true; if (isRefresh) { @@ -41,17 +41,16 @@ abstract class CommonListController extends CommonController { if (isRefresh) { checkIsEnd(dataList.length); loadingState.value = Success(dataList); - } else if (loadingState.value is Success) { - final list = loadingState.value.data!..addAll(dataList); - checkIsEnd(list.length); + } else if (loadingState.value case Success(:final response)) { + response!.addAll(dataList); + checkIsEnd(response.length); loadingState.refresh(); } } page++; } else { - if (isRefresh && - !handleError(response is Error ? response.errMsg : null)) { - loadingState.value = response as LoadingState?>; + if (isRefresh && !handleError(res is Error ? res.errMsg : null)) { + loadingState.value = res as Error; } } isLoading = false; diff --git a/lib/pages/common/common_whisper_controller.dart b/lib/pages/common/common_whisper_controller.dart index 6b5139bae..e82cb5a94 100644 --- a/lib/pages/common/common_whisper_controller.dart +++ b/lib/pages/common/common_whisper_controller.dart @@ -65,10 +65,9 @@ abstract class CommonWhisperController Future onClearUnread() async { final res = await ImGrpc.clearUnread(pageType: sessionPageType); if (res.isSuccess) { - if (loadingState.value.isSuccess) { - List? list = loadingState.value.data; - if (list != null && list.isNotEmpty) { - for (final item in list) { + if (loadingState.value case Success(:final response)) { + if (response != null && response.isNotEmpty) { + for (final item in response) { if (item.hasUnread()) { item.clearUnread(); } diff --git a/lib/pages/common/multi_select/base.dart b/lib/pages/common/multi_select/base.dart index 8a096856c..82f8d9b40 100644 --- a/lib/pages/common/multi_select/base.dart +++ b/lib/pages/common/multi_select/base.dart @@ -91,14 +91,13 @@ mixin CommonMultiSelectMixin @override void handleSelect({bool checked = false, bool disableSelect = true}) { - if (loadingState.value.isSuccess) { - final list = loadingState.value.data; - if (list != null && list.isNotEmpty) { - for (final item in list) { + if (loadingState.value case Success(:final response)) { + if (response != null && response.isNotEmpty) { + for (final item in response) { item.checked = checked; } loadingState.refresh(); - rxCount.value = checked ? list.length : 0; + rxCount.value = checked ? response.length : 0; } } if (disableSelect && !checked) { diff --git a/lib/pages/common/reply_controller.dart b/lib/pages/common/reply_controller.dart index 15c5cee7e..d99e953d6 100644 --- a/lib/pages/common/reply_controller.dart +++ b/lib/pages/common/reply_controller.dart @@ -177,13 +177,12 @@ abstract class ReplyController extends CommonListController { if (res != null) { savedReplies.remove(key); ReplyInfo replyInfo = RequestUtils.replyCast(res); - if (loadingState.value.isSuccess) { - List? list = loadingState.value.data; - if (list == null) { + if (loadingState.value case Success(:final response)) { + if (response == null) { loadingState.value = Success([replyInfo]); } else { if (oid != null) { - list.insert(hasUpTop ? 1 : 0, replyInfo); + response.insert(hasUpTop ? 1 : 0, replyInfo); } else { replyItem! ..count += 1 @@ -206,9 +205,8 @@ abstract class ReplyController extends CommonListController { } void onRemove(int index, ReplyInfo item, int? subIndex) { - List list = loadingState.value.data!; if (subIndex == null) { - list.removeAt(index); + loadingState.value.data!.removeAt(index); } else { item ..count -= 1 @@ -241,12 +239,12 @@ abstract class ReplyController extends CommonListController { isUpTop: isUpTop, ); if (res.isSuccess) { - List list = loadingState.value.data!; item.replyControl.isUpTop = !isUpTop; if (!isUpTop && index != 0) { - list[0].replyControl.isUpTop = false; - final item = list.removeAt(index); - list.insert(0, item); + final list = loadingState.value.data!; + list + ..first.replyControl.isUpTop = false + ..insert(0, list.removeAt(index)); } loadingState.refresh(); SmartDialog.showToast('${isUpTop ? '取消' : ''}置顶成功'); diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index fd12b79f4..bb2121824 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -3,6 +3,7 @@ import 'dart:io' show File; import 'package:PiliPlus/grpc/bilibili/community/service/dm/v1.pb.dart'; import 'package:PiliPlus/grpc/dm.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/path_utils.dart'; @@ -46,17 +47,16 @@ class PlDanmakuController { return; } _requestedSeg.add(segmentIndex); - final result = await DmGrpc.dmSegMobile( + final res = await DmGrpc.dmSegMobile( cid: _cid, segmentIndex: segmentIndex + 1, ); - if (result.isSuccess) { - final data = result.data; - if (data.state == 1) { + if (res case Success(:final response)) { + if (response.state == 1) { _plPlayerController.dmState.add(_cid); } - handleDanmaku(data.elems); + handleDanmaku(response.elems); } else { _requestedSeg.remove(segmentIndex); } diff --git a/lib/pages/danmaku_block/controller.dart b/lib/pages/danmaku_block/controller.dart index db1ee33d8..9b535409c 100644 --- a/lib/pages/danmaku_block/controller.dart +++ b/lib/pages/danmaku_block/controller.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:PiliPlus/http/danmaku_block.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/dm_block_type.dart'; import 'package:PiliPlus/models/user/danmaku_block.dart'; import 'package:archive/archive.dart' show getCrc32; @@ -34,13 +35,12 @@ class DanmakuBlockController extends GetxController SmartDialog.showLoading(msg: '正在同步弹幕屏蔽规则……'); final result = await DanmakuFilterHttp.danmakuFilter(); SmartDialog.dismiss(); - if (result.isSuccess) { - final data = result.data; - rules[0].addAll(data.rule); - rules[1].addAll(data.rule1); - rules[2].addAll(data.rule2); - if (data.toast != null) { - SmartDialog.showToast(data.toast!); + if (result case Success(:final response)) { + rules[0].addAll(response.rule); + rules[1].addAll(response.rule1); + rules[2].addAll(response.rule2); + if (response.toast case final toast?) { + SmartDialog.showToast(toast); } } else { result.toast(); @@ -49,13 +49,13 @@ class DanmakuBlockController extends GetxController Future danmakuFilterDel(int tabIndex, int itemIndex, int id) async { SmartDialog.showLoading(msg: '正在删除弹幕屏蔽规则……'); - final result = await DanmakuFilterHttp.danmakuFilterDel(ids: id); + final res = await DanmakuFilterHttp.danmakuFilterDel(ids: id); SmartDialog.dismiss(); - if (result.isSuccess) { + if (res.isSuccess) { rules[tabIndex].removeAt(itemIndex); SmartDialog.showToast('删除成功'); } else { - result.toast(); + res.toast(); } } @@ -67,16 +67,16 @@ class DanmakuBlockController extends GetxController filter = getCrc32(ascii.encode(filter), 0).toRadixString(16); } SmartDialog.showLoading(msg: '正在添加弹幕屏蔽规则……'); - final result = await DanmakuFilterHttp.danmakuFilterAdd( + final res = await DanmakuFilterHttp.danmakuFilterAdd( filter: filter, type: type, ); SmartDialog.dismiss(); - if (result.isSuccess) { - rules[type].add(result.data); + if (res case Success(:final response)) { + rules[type].add(response); SmartDialog.showToast('添加成功'); } else { - result.toast(); + res.toast(); } } } diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart index 20e6e6375..7eef83034 100644 --- a/lib/pages/dynamics/controller.dart +++ b/lib/pages/dynamics/controller.dart @@ -77,15 +77,14 @@ class DynamicsController extends GetxController final res = await DynamicsHttp.dynUpList(upState.value.data.offset); - if (res.isSuccess) { - final data = res.data; - if (data.hasMore == false || data.offset.isNullOrEmpty) { + if (res case Success(:final response)) { + if (response.hasMore == false || response.offset.isNullOrEmpty) { _upEnd = true; } final upData = upState.value.data - ..hasMore = data.hasMore - ..offset = data.offset; - final list = data.upList; + ..hasMore = response.hasMore + ..offset = response.offset; + final list = response.upList; if (list != null && list.isNotEmpty) { upData.upList.addAll(list); upState.refresh(); @@ -106,9 +105,9 @@ class DynamicsController extends GetxController ps: 50, ); - if (res.isSuccess) { + if (res case Success(:final response)) { _upPage++; - final list = res.data.list; + final list = response.list; if (list.isEmpty) { _upEnd = true; } @@ -149,11 +148,11 @@ class DynamicsController extends GetxController ]); final first = res.first; - if (first.isSuccess) { - FollowUpModel data = first.data as FollowUpModel; + if (first case final Success i) { + final data = i.response; final second = res.getOrNull(1); - if (second != null && second.isSuccess) { - FollowData data1 = second.data as FollowData; + if (second case final Success j) { + final data1 = j.response; final list1 = data1.list; _upPage++; diff --git a/lib/pages/dynamics/widgets/rich_node_panel.dart b/lib/pages/dynamics/widgets/rich_node_panel.dart index 6953ebf4e..58b2fb444 100644 --- a/lib/pages/dynamics/widgets/rich_node_panel.dart +++ b/lib/pages/dynamics/widgets/rich_node_panel.dart @@ -3,6 +3,7 @@ import 'dart:io' show Platform; import 'package:PiliPlus/common/widgets/image/custom_grid_view.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/http/dynamics.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/models/common/image_preview_type.dart' show SourceModel; @@ -288,15 +289,14 @@ TextSpan? richNode( } DynamicsHttp.dynPic(i.rid).then((res) { - if (res.isSuccess) { - final list = res.data; + if (res case Success(:final response)) { if (Platform.isAndroid) { - i.pics = list; + i.pics = response; } else { - i.dynPic = list; + i.dynPic = response; } - if (list != null && list.isNotEmpty) { - onView(list); + if (response != null && response.isNotEmpty) { + onView(response); } } else { res.toast(); diff --git a/lib/pages/dynamics/widgets/vote.dart b/lib/pages/dynamics/widgets/vote.dart index aa300e5ce..558625da7 100644 --- a/lib/pages/dynamics/widgets/vote.dart +++ b/lib/pages/dynamics/widgets/vote.dart @@ -53,8 +53,9 @@ class _VotePanelState extends State { _voteInfo = widget.voteInfo; if (isLogin) { DynamicsHttp.followeeVotes(voteId: _voteInfo.voteId).then((res) { - if (mounted && res.isSuccess) { - followeeVote.value = res.data; + if (!mounted) return; + if (res case Success(:final response)) { + followeeVote.value = response; } }); } @@ -118,15 +119,13 @@ class _VotePanelState extends State { groupValue.toSet(), anonymous, ); - if (res.isSuccess) { - if (mounted) { - setState(() { - _enabled = false; - _showPercentage = true; - _voteInfo = res.data; - _percentage = _cnt2Percentage(_voteInfo.options); - }); - } + if (!mounted) return; + if (res case Success(:final response)) { + _enabled = false; + _showPercentage = true; + _voteInfo = response; + _percentage = _cnt2Percentage(_voteInfo.options); + setState(() {}); } else { res.toast(); } diff --git a/lib/pages/dynamics_create_reserve/controller.dart b/lib/pages/dynamics_create_reserve/controller.dart index 2215d52d3..c25db9315 100644 --- a/lib/pages/dynamics_create_reserve/controller.dart +++ b/lib/pages/dynamics_create_reserve/controller.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/http/dynamics.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/dynamic/dyn_reserve_info/data.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:get/get.dart'; @@ -29,12 +30,11 @@ class CreateReserveController extends GetxController { Future queryData() async { final res = await DynamicsHttp.reserveInfo(sid: sid); - if (res.isSuccess) { - ReserveInfoData data = res.data; + if (res case Success(:final response)) { key = Utils.generateRandomString(6); - title.value = data.title!; + title.value = response.title!; date.value = DateTime.fromMillisecondsSinceEpoch( - data.livePlanStartTime! * 1000, + response.livePlanStartTime! * 1000, ); canCreate.value = true; } else { @@ -56,10 +56,10 @@ class CreateReserveController extends GetxController { title: title.value, livePlanStartTime: livePlanStartTime, ); - if (res.isSuccess) { + if (res case Success(:final response)) { Get.back( result: ReserveInfoData( - id: res.data, + id: response, title: title.value, livePlanStartTime: livePlanStartTime, ), diff --git a/lib/pages/dynamics_create_vote/controller.dart b/lib/pages/dynamics_create_vote/controller.dart index e5e6e5a62..4e57cf3e0 100644 --- a/lib/pages/dynamics_create_vote/controller.dart +++ b/lib/pages/dynamics_create_vote/controller.dart @@ -1,5 +1,6 @@ import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/http/dynamics.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/msg.dart'; import 'package:PiliPlus/models/dynamics/vote_model.dart'; import 'package:PiliPlus/utils/accounts.dart'; @@ -56,15 +57,16 @@ class CreateVoteController extends GetxController { Future queryData() async { final res = await DynamicsHttp.voteInfo(voteId); - if (res.isSuccess) { + if (res case Success(:final response)) { key = Utils.generateRandomString(6); - final VoteInfo data = res.data; - title.value = data.title!; - desc.value = data.desc ?? ''; - type.value = data.options.first.imgUrl?.isNotEmpty == true ? 1 : 0; - options.value = data.options; - choiceCnt.value = data.choiceCnt!; - endtime.value = DateTime.fromMillisecondsSinceEpoch(data.endTime! * 1000); + title.value = response.title!; + desc.value = response.desc ?? ''; + type.value = response.options.first.imgUrl?.isNotEmpty == true ? 1 : 0; + options.value = response.options; + choiceCnt.value = response.choiceCnt!; + endtime.value = DateTime.fromMillisecondsSinceEpoch( + response.endTime! * 1000, + ); canCreate.value = true; } else { showConfirmDialog( @@ -98,8 +100,8 @@ class CreateVoteController extends GetxController { final res = await (voteId == null ? DynamicsHttp.createVote(voteInfo) : DynamicsHttp.updateVote(voteInfo)); - if (res.isSuccess) { - voteInfo.voteId = res.data; + if (res case Success(:final response)) { + voteInfo.voteId = response; Get.back(result: voteInfo); } else { res.toast(); @@ -112,9 +114,9 @@ class CreateVoteController extends GetxController { category: 'daily', biz: 'vote', ); - if (res.isSuccess) { + if (res case Success(:final response)) { options - ..[index].imgUrl = res.data.imageUrl + ..[index].imgUrl = response.imageUrl ..refresh(); updateCanCreate(); } else { diff --git a/lib/pages/dynamics_detail/controller.dart b/lib/pages/dynamics_detail/controller.dart index 5b1bb96e7..3737f2eb1 100644 --- a/lib/pages/dynamics_detail/controller.dart +++ b/lib/pages/dynamics_detail/controller.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/http/dynamics.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/pages/common/dyn/common_dyn_controller.dart'; import 'package:PiliPlus/utils/id_utils.dart'; @@ -30,9 +31,8 @@ class DynamicDetailController extends CommonDynController { _init(commentIdStr, commentType); } else { DynamicsHttp.dynamicDetail(id: dynItem.idStr).then((res) { - if (res.isSuccess) { - final data = res.data; - _init(data.basic!.commentIdStr!, data.basic!.commentType!); + if (res case Success(:final response)) { + _init(response.basic!.commentIdStr!, response.basic!.commentType!); } else { res.toast(); } diff --git a/lib/pages/dynamics_topic/controller.dart b/lib/pages/dynamics_topic/controller.dart index cc78e317d..1c7623dc1 100644 --- a/lib/pages/dynamics_topic/controller.dart +++ b/lib/pages/dynamics_topic/controller.dart @@ -39,8 +39,8 @@ class DynTopicController Future queryTop() async { topState.value = await DynamicsHttp.topicTop(topicId: topicId); - if (topState.value.isSuccess) { - final topicItem = topState.value.data!.topicItem!; + if (topState.value case Success(:final response)) { + final topicItem = response!.topicItem!; topicName = topicItem.name; isFav.value = topicItem.isFav; isLike.value = topicItem.isLike; diff --git a/lib/pages/dynamics_topic/view.dart b/lib/pages/dynamics_topic/view.dart index d2ae31b46..d1f3420c9 100644 --- a/lib/pages/dynamics_topic/view.dart +++ b/lib/pages/dynamics_topic/view.dart @@ -158,185 +158,184 @@ class _DynTopicPageState extends State with DynMixin { ) { return switch (topState) { Loading() => const SliverAppBar(), - Success(:final response) when (topState.dataOrNull != null) => - DynamicSliverAppBarMedium( - pinned: true, - afterCalc: (value) => - _controller.appbarOffset = value - kToolbarHeight - padding.top, - title: IgnorePointer(child: Text(response!.topicItem!.name)), - flexibleSpace: Container( - decoration: BoxDecoration( - image: DecorationImage( - image: Image.asset( - 'assets/images/topic-header-bg.png', - ).image, - filterQuality: FilterQuality.low, - fit: BoxFit.cover, - ), - ), - padding: EdgeInsets.only( - top: padding.top, - left: 12 + padding.left, - right: 12 + padding.right, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - height: kToolbarHeight, - alignment: Alignment.centerLeft, - margin: const EdgeInsets.only(left: 45, right: 78), - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () => Get.toNamed( - '/member?mid=${response.topicCreator!.uid}', - ), - child: Row( - spacing: 10, - mainAxisSize: MainAxisSize.min, - children: [ - NetworkImgLayer( - width: 28, - height: 28, - src: response.topicCreator!.face!, - type: ImageType.avatar, - ), - Flexible( - child: Text( - response.topicCreator!.name!, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - Text( - ' 发起', - style: TextStyle(color: theme.colorScheme.outline), - ), - ], - ), - ), - ), - Text( - response.topicItem!.name, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 6), - SelectableText( - response.topicItem!.description!, - style: TextStyle(color: theme.colorScheme.onSurfaceVariant), - ), - const SizedBox(height: 10), - Row( - children: [ - Text( - '${NumUtils.numFormat(response.topicItem!.view)}浏览 · ${NumUtils.numFormat(response.topicItem!.discuss)}讨论', - style: TextStyle( - fontSize: 13, - color: theme.colorScheme.outline, - ), - ), - const Spacer(), - OutlinedButton.icon( - style: OutlinedButton.styleFrom( - side: BorderSide( - width: 1, - color: theme.colorScheme.outline.withValues( - alpha: 0.2, - ), - ), - foregroundColor: _controller.isLike.value == true - ? null - : theme.colorScheme.onSurfaceVariant, - padding: const EdgeInsets.symmetric(horizontal: 10), - visualDensity: const VisualDensity( - horizontal: -4, - vertical: -4, - ), - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - onPressed: _controller.onLike, - icon: _controller.isLike.value == true - ? const Icon(FontAwesomeIcons.solidThumbsUp, size: 13) - : const Icon(FontAwesomeIcons.thumbsUp, size: 13), - label: Text( - NumUtils.numFormat(response.topicItem!.like), - style: const TextStyle(fontSize: 13), - textScaler: TextScaler.noScaling, - ), - ), - const SizedBox(width: 10), - OutlinedButton.icon( - style: OutlinedButton.styleFrom( - side: BorderSide( - width: 1, - color: theme.colorScheme.outline.withValues( - alpha: 0.2, - ), - ), - foregroundColor: _controller.isFav.value == true - ? null - : theme.colorScheme.onSurfaceVariant, - padding: const EdgeInsets.symmetric(horizontal: 10), - visualDensity: const VisualDensity( - horizontal: -4, - vertical: -4, - ), - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - onPressed: _controller.onFav, - icon: _controller.isFav.value == true - ? const Icon(FontAwesomeIcons.solidStar, size: 13) - : const Icon(FontAwesomeIcons.star, size: 13), - label: Text( - NumUtils.numFormat(response.topicItem!.fav), - style: const TextStyle(fontSize: 13), - textScaler: TextScaler.noScaling, - ), - ), - ], - ), - const SizedBox(height: 6), - ], + Success(:final response) when response != null => DynamicSliverAppBarMedium( + pinned: true, + afterCalc: (value) => + _controller.appbarOffset = value - kToolbarHeight - padding.top, + title: IgnorePointer(child: Text(response.topicItem!.name)), + flexibleSpace: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: Image.asset( + 'assets/images/topic-header-bg.png', + ).image, + filterQuality: FilterQuality.low, + fit: BoxFit.cover, ), ), - actions: [ - IconButton( - onPressed: () => Utils.shareText( - '${_controller.topicName} https://m.bilibili.com/topic-detail?topic_id=${_controller.topicId}', + padding: EdgeInsets.only( + top: padding.top, + left: 12 + padding.left, + right: 12 + padding.right, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: kToolbarHeight, + alignment: Alignment.centerLeft, + margin: const EdgeInsets.only(left: 45, right: 78), + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => Get.toNamed( + '/member?mid=${response.topicCreator!.uid}', + ), + child: Row( + spacing: 10, + mainAxisSize: MainAxisSize.min, + children: [ + NetworkImgLayer( + width: 28, + height: 28, + src: response.topicCreator!.face!, + type: ImageType.avatar, + ), + Flexible( + child: Text( + response.topicCreator!.name!, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Text( + ' 发起', + style: TextStyle(color: theme.colorScheme.outline), + ), + ], + ), + ), ), - // https://www.bilibili.com/v/topic/detail?topic_id=${_controller.topicId} - icon: const Icon(MdiIcons.share), - ), - PopupMenuButton( - itemBuilder: (context) { - return [ - PopupMenuItem( - onTap: _controller.onFav, - child: Text( - '${_controller.isFav.value == true ? '取消' : ''}收藏', + Text( + response.topicItem!.name, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 6), + SelectableText( + response.topicItem!.description!, + style: TextStyle(color: theme.colorScheme.onSurfaceVariant), + ), + const SizedBox(height: 10), + Row( + children: [ + Text( + '${NumUtils.numFormat(response.topicItem!.view)}浏览 · ${NumUtils.numFormat(response.topicItem!.discuss)}讨论', + style: TextStyle( + fontSize: 13, + color: theme.colorScheme.outline, ), ), - PopupMenuItem( - child: const Text('举报'), - onTap: () { - if (!_controller.isLogin) { - SmartDialog.showToast('账号未登录'); - return; - } - PageUtils.inAppWebview( - 'https://www.bilibili.com/h5/topic-active/topic-report?topic_id=${_controller.topicId}&topic_name=${_controller.topicName}&${Utils.themeUrl(theme.colorScheme.isDark)}', - ); - }, + const Spacer(), + OutlinedButton.icon( + style: OutlinedButton.styleFrom( + side: BorderSide( + width: 1, + color: theme.colorScheme.outline.withValues( + alpha: 0.2, + ), + ), + foregroundColor: _controller.isLike.value == true + ? null + : theme.colorScheme.onSurfaceVariant, + padding: const EdgeInsets.symmetric(horizontal: 10), + visualDensity: const VisualDensity( + horizontal: -4, + vertical: -4, + ), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + onPressed: _controller.onLike, + icon: _controller.isLike.value == true + ? const Icon(FontAwesomeIcons.solidThumbsUp, size: 13) + : const Icon(FontAwesomeIcons.thumbsUp, size: 13), + label: Text( + NumUtils.numFormat(response.topicItem!.like), + style: const TextStyle(fontSize: 13), + textScaler: TextScaler.noScaling, + ), ), - ]; - }, - ), - const SizedBox(width: 4), - ], + const SizedBox(width: 10), + OutlinedButton.icon( + style: OutlinedButton.styleFrom( + side: BorderSide( + width: 1, + color: theme.colorScheme.outline.withValues( + alpha: 0.2, + ), + ), + foregroundColor: _controller.isFav.value == true + ? null + : theme.colorScheme.onSurfaceVariant, + padding: const EdgeInsets.symmetric(horizontal: 10), + visualDensity: const VisualDensity( + horizontal: -4, + vertical: -4, + ), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + onPressed: _controller.onFav, + icon: _controller.isFav.value == true + ? const Icon(FontAwesomeIcons.solidStar, size: 13) + : const Icon(FontAwesomeIcons.star, size: 13), + label: Text( + NumUtils.numFormat(response.topicItem!.fav), + style: const TextStyle(fontSize: 13), + textScaler: TextScaler.noScaling, + ), + ), + ], + ), + const SizedBox(height: 6), + ], + ), ), + actions: [ + IconButton( + onPressed: () => Utils.shareText( + '${_controller.topicName} https://m.bilibili.com/topic-detail?topic_id=${_controller.topicId}', + ), + // https://www.bilibili.com/v/topic/detail?topic_id=${_controller.topicId} + icon: const Icon(MdiIcons.share), + ), + PopupMenuButton( + itemBuilder: (context) { + return [ + PopupMenuItem( + onTap: _controller.onFav, + child: Text( + '${_controller.isFav.value == true ? '取消' : ''}收藏', + ), + ), + PopupMenuItem( + child: const Text('举报'), + onTap: () { + if (!_controller.isLogin) { + SmartDialog.showToast('账号未登录'); + return; + } + PageUtils.inAppWebview( + 'https://www.bilibili.com/h5/topic-active/topic-report?topic_id=${_controller.topicId}&topic_name=${_controller.topicName}&${Utils.themeUrl(theme.colorScheme.isDark)}', + ); + }, + ), + ]; + }, + ), + const SizedBox(width: 4), + ], + ), _ => SliverAppBar( pinned: true, title: Text(_controller.topicName), diff --git a/lib/pages/episode_panel/view.dart b/lib/pages/episode_panel/view.dart index 42525aa40..e1cdd9552 100644 --- a/lib/pages/episode_panel/view.dart +++ b/lib/pages/episode_panel/view.dart @@ -595,17 +595,17 @@ class _EpisodePanelState extends State ? const Icon(Icons.notifications_off_outlined) : const Icon(Icons.notifications_active_outlined), onPressed: () async { - final result = await FavHttp.seasonFav( + final res = await FavHttp.seasonFav( isFav: response, seasonId: widget.seasonId, ); - if (result.isSuccess) { + if (res.isSuccess) { SmartDialog.showToast('${response ? '取消' : ''}订阅成功'); _favState!.value = Success(!response); widget.ugcIntroController?.seasonFavState[widget.seasonId] = !response; } else { - result.toast(); + res.toast(); } }, ), diff --git a/lib/pages/fav/pgc/controller.dart b/lib/pages/fav/pgc/controller.dart index 21806283c..91b413e29 100644 --- a/lib/pages/fav/pgc/controller.dart +++ b/lib/pages/fav/pgc/controller.dart @@ -77,14 +77,14 @@ class FavPgcController if (res case Success(:final response)) { try { final ctr = Get.find(tag: '$type$followStatus'); - if (ctr.loadingState.value.isSuccess) { - ctr.loadingState - ..value.data!.insertAll( - 0, - removeList.map((item) => item..checked = false), - ) - ..refresh(); - ctr.allSelected.value = false; + if (ctr.loadingState.value case Success(:final response)) { + response?.insertAll( + 0, + removeList.map((item) => item..checked = false), + ); + ctr + ..loadingState.refresh() + ..allSelected.value = false; } } catch (e) { if (kDebugMode) debugPrint('fav pgc onUpdate: $e'); @@ -97,28 +97,28 @@ class FavPgcController } Future onUpdate(int index, int followStatus, int? seasonId) async { - final result = await VideoHttp.pgcUpdate( + final res = await VideoHttp.pgcUpdate( seasonId: seasonId.toString(), status: followStatus, ); - if (result case Success(:final response)) { + if (res case Success(:final response)) { List list = loadingState.value.data!; final item = list.removeAt(index); loadingState.refresh(); try { final ctr = Get.find(tag: '$type$followStatus'); - if (ctr.loadingState.value.isSuccess) { - ctr.loadingState - ..value.data?.insert(0, item) - ..refresh(); - ctr.allSelected.value = false; + if (ctr.loadingState.value case Success(:final response)) { + response?.insert(0, item); + ctr + ..loadingState.refresh() + ..allSelected.value = false; } } catch (e) { if (kDebugMode) debugPrint('fav pgc pgcUpdate: $e'); } SmartDialog.showToast(response); } else { - result.toast(); + res.toast(); } } } diff --git a/lib/pages/fav/view.dart b/lib/pages/fav/view.dart index d2131651f..0124257e5 100644 --- a/lib/pages/fav/view.dart +++ b/lib/pages/fav/view.dart @@ -2,7 +2,6 @@ import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/view_safe_area.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/fav_type.dart'; -import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; import 'package:PiliPlus/pages/fav/article/controller.dart'; import 'package:PiliPlus/pages/fav/cheese/controller.dart'; import 'package:PiliPlus/pages/fav/topic/controller.dart'; @@ -63,10 +62,8 @@ class _FavPageState extends State with SingleTickerProviderStateMixin { onPressed: () => Get.toNamed('/createFav')?.then( (data) { if (data != null) { - List? list = - _favController.loadingState.value.isSuccess - ? _favController.loadingState.value.data - : null; + final list = + _favController.loadingState.value.dataOrNull; if (list != null && list.isNotEmpty) { list.insert(1, data); _favController.loadingState.refresh(); @@ -104,10 +101,11 @@ class _FavPageState extends State with SingleTickerProviderStateMixin { () => _showVideoFavMenu.value ? IconButton( onPressed: () { - if (_favController.loadingState.value.isSuccess) { + if (_favController.loadingState.value case Success( + :final response, + )) { try { - final item = - _favController.loadingState.value.data!.first; + final item = response!.first; Get.toNamed( '/favSearch', arguments: { diff --git a/lib/pages/fav_detail/controller.dart b/lib/pages/fav_detail/controller.dart index 075343c65..36245bfb5 100644 --- a/lib/pages/fav_detail/controller.dart +++ b/lib/pages/fav_detail/controller.dart @@ -32,18 +32,18 @@ mixin BaseFavController void onViewFav(FavDetailItemModel item, int? index); Future onCancelFav(int index, int id, int type) async { - final result = await FavHttp.favVideo( + final res = await FavHttp.favVideo( resources: '$id:$type', delIds: mediaId.toString(), ); - if (result.isSuccess) { + if (res.isSuccess) { loadingState ..value.data!.removeAt(index) ..refresh(); updateCount?.call(1); SmartDialog.showToast('取消收藏'); } else { - result.toast(); + res.toast(); } } @@ -55,18 +55,18 @@ mixin BaseFavController title: '提示', onConfirm: () async { final removeList = allChecked.toSet(); - final result = await FavHttp.favVideo( + final res = await FavHttp.favVideo( resources: removeList .map((item) => '${item.id}:${item.type}') .join(','), delIds: mediaId.toString(), ); - if (result.isSuccess) { + if (res.isSuccess) { updateCount?.call(removeList.length); afterDelete(removeList); SmartDialog.showToast('取消收藏'); } else { - result.toast(); + res.toast(); } }, ); @@ -199,13 +199,14 @@ class FavDetailController } void onSort() { - if (loadingState.value.isSuccess && - loadingState.value.data?.isNotEmpty == true) { - if (folderInfo.value.mediaCount > 1000) { - SmartDialog.showToast('内容太多啦!超过1000不支持排序'); - return; + if (loadingState.value case Success(:final response)) { + if (response != null && response.isNotEmpty) { + if (folderInfo.value.mediaCount > 1000) { + SmartDialog.showToast('内容太多啦!超过1000不支持排序'); + return; + } + Get.to(FavSortPage(favDetailController: this)); } - Get.to(FavSortPage(favDetailController: this)); } } diff --git a/lib/pages/fav_sort/view.dart b/lib/pages/fav_sort/view.dart index 2506765fc..e3ff614cc 100644 --- a/lib/pages/fav_sort/view.dart +++ b/lib/pages/fav_sort/view.dart @@ -32,10 +32,10 @@ class _FavSortPageState extends State { } _favDetailController.onLoadMore().whenComplete(() { try { - if (_favDetailController.loadingState.value.isSuccess) { - List list = - _favDetailController.loadingState.value.data!; - sortList.addAll(list.skip(sortList.length)); + if (_favDetailController.loadingState.value case Success( + :final response, + )) { + sortList.addAll(response!.skip(sortList.length)); if (mounted) { setState(() {}); } diff --git a/lib/pages/follow/child/child_controller.dart b/lib/pages/follow/child/child_controller.dart index acc0115c1..28aa15ad0 100644 --- a/lib/pages/follow/child/child_controller.dart +++ b/lib/pages/follow/child/child_controller.dart @@ -85,8 +85,8 @@ class FollowChildController Future _loadSameFollow() async { final res = await UserHttp.sameFollowing(mid: mid); - if (res.isSuccess) { - sameState.value = Success(res.data.list); + if (res case Success(:final response)) { + sameState.value = Success(response.list); } } } diff --git a/lib/pages/follow/controller.dart b/lib/pages/follow/controller.dart index 5bd61d984..b803ed8a1 100644 --- a/lib/pages/follow/controller.dart +++ b/lib/pages/follow/controller.dart @@ -41,10 +41,10 @@ class FollowController extends GetxController with GetTickerProviderStateMixin { Future queryFollowUpTags() async { final res = await MemberHttp.followUpTags(); - if (res.isSuccess) { + if (res case Success(:final response)) { tabs ..assign(MemberTagItemModel(name: '全部关注')) - ..addAll(res.data); + ..addAll(response); int initialIndex = 0; if (tabController != null) { initialIndex = tabController!.index.clamp(0, tabs.length - 1); diff --git a/lib/pages/history/controller.dart b/lib/pages/history/controller.dart index 4a76eece6..2e95e6872 100644 --- a/lib/pages/history/controller.dart +++ b/lib/pages/history/controller.dart @@ -106,18 +106,18 @@ class HistoryController Future _onDelete(Set removeList) async { SmartDialog.showLoading(msg: '请求中'); - final response = await UserHttp.delHistory( + final res = await UserHttp.delHistory( removeList .map((item) => '${item.history.business}_${item.kid}') .join(','), account: account, ); SmartDialog.dismiss(); - if (response.isSuccess) { + if (res.isSuccess) { afterDelete(removeList); SmartDialog.showToast('已删除'); } else { - response.toast(); + res.toast(); } } diff --git a/lib/pages/live/controller.dart b/lib/pages/live/controller.dart index b4bb0bf5e..287d7831b 100644 --- a/lib/pages/live/controller.dart +++ b/lib/pages/live/controller.dart @@ -94,14 +94,13 @@ class LiveController extends CommonListController with AccountMixin { Future queryTop() async { final res = await LiveHttp.liveFeedIndex(pn: page, moduleSelect: true); - if (res.isSuccess) { - final data = res.data; + if (res case Success(:final response)) { topState.value = Pair( - first: data.followItem, - second: data.areaItem, + first: response.followItem, + second: response.areaItem, ); areaIndex.value = - (data.areaItem?.cardData?.areaEntranceV3?.list?.indexWhere( + (response.areaItem?.cardData?.areaEntranceV3?.list?.indexWhere( (e) => e.areaV2Id == areaId && e.areaV2ParentId == parentAreaId, ) ?? -2) + diff --git a/lib/pages/live_area/controller.dart b/lib/pages/live_area/controller.dart index 54ec38dd5..400fe5617 100644 --- a/lib/pages/live_area/controller.dart +++ b/lib/pages/live_area/controller.dart @@ -43,9 +43,9 @@ class LiveAreaController } Future setFavTag() async { - if (favState.value.isSuccess) { + if (favState.value case Success(:final response)) { final res = await LiveHttp.setLiveFavTag( - ids: favState.value.data.map((e) => e.id).join(','), + ids: response.map((e) => e.id).join(','), ); if (res.isSuccess) { isEditing.value = !isEditing.value; diff --git a/lib/pages/live_area/view.dart b/lib/pages/live_area/view.dart index 345e7e7c8..6a6709afa 100644 --- a/lib/pages/live_area/view.dart +++ b/lib/pages/live_area/view.dart @@ -169,8 +169,7 @@ class _LiveAreaPageState extends State { ThemeData theme, LoadingState?> loadingState, ) { - if (loadingState.isSuccess) { - final List? list = loadingState.data; + if (loadingState case Success(:final response)) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 12), child: Column( @@ -191,23 +190,23 @@ class _LiveAreaPageState extends State { ), ), const SizedBox(height: 8), - if (list != null && list.isNotEmpty) ...[ + if (response != null && response.isNotEmpty) ...[ SortableWrap( onSortStart: (index) { _controller.isEditing.value = true; }, onSorted: (int oldIndex, int newIndex) { - list.insert(newIndex, list.removeAt(oldIndex)); + response.insert(newIndex, response.removeAt(oldIndex)); }, spacing: 12, runSpacing: 8, - children: list + children: response .map( (item) => _favTagItem( theme: theme, item: item, onPressed: () { - list.remove(item); + response.remove(item); _controller ..favInfo[item.id] = false ..favState.refresh(); @@ -276,27 +275,30 @@ class _LiveAreaPageState extends State { top: 0, right: 16, child: Obx(() { - if (_controller.isEditing.value && - _controller.favState.value.isSuccess) { - bool? isFav = _controller.favInfo[item.id]; - if (isFav == null) { - isFav = _controller.favState.value.data.contains(item); - _controller.favInfo[item.id] = isFav; + if (_controller.isEditing.value) { + if (_controller.favState.value case Success( + :final response, + )) { + bool? isFav = _controller.favInfo[item.id]; + if (isFav == null) { + isFav = response.contains(item); + _controller.favInfo[item.id] = isFav; + } + return iconButton( + size: 17, + iconSize: 13, + icon: isFav + ? const Icon(MdiIcons.check) + : const Icon(MdiIcons.plus), + bgColor: isFav + ? theme.colorScheme.onInverseSurface + : theme.colorScheme.secondaryContainer, + iconColor: isFav + ? theme.colorScheme.outline + : theme.colorScheme.onSecondaryContainer, + onPressed: onPressed, + ); } - return iconButton( - size: 17, - iconSize: 13, - icon: isFav - ? const Icon(MdiIcons.check) - : const Icon(MdiIcons.plus), - bgColor: isFav - ? theme.colorScheme.onInverseSurface - : theme.colorScheme.secondaryContainer, - iconColor: isFav - ? theme.colorScheme.outline - : theme.colorScheme.onSecondaryContainer, - onPressed: onPressed, - ); } return const SizedBox.shrink(); }), diff --git a/lib/pages/live_dm_block/controller.dart b/lib/pages/live_dm_block/controller.dart index 46e285272..a233e89c0 100644 --- a/lib/pages/live_dm_block/controller.dart +++ b/lib/pages/live_dm_block/controller.dart @@ -33,19 +33,18 @@ class LiveDmBlockController extends GetxController Future queryData() async { final res = await LiveHttp.getLiveInfoByUser(roomId); - if (res.isSuccess) { - final data = res.data; - final shieldRules = data?.shieldRules; + if (res case Success(:final response)) { + final shieldRules = response?.shieldRules; level.value = shieldRules?.level ?? 0; rank.value = shieldRules?.rank ?? 0; verify.value = shieldRules?.verify ?? 0; updateValue(); - if (data?.keywordList != null) { - keywordList.addAll(data!.keywordList!); + if (response?.keywordList case final keywordList?) { + keywordList.addAll(keywordList); } - if (data?.shieldUserList != null) { - shieldUserList.addAll(data!.shieldUserList!); + if (response?.shieldUserList case final shieldUserList?) { + shieldUserList.addAll(shieldUserList); } } else { res.toast(); diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index d39d63714..3675f650d 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart'; import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/live.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/common/super_chat_type.dart'; import 'package:PiliPlus/models/common/video/live_quality.dart'; @@ -221,25 +222,24 @@ class LiveRoomController extends GetxController { qn: currentQn, onlyAudio: plPlayerController.onlyPlayAudio.value, ); - if (res.isSuccess) { - final data = res.data; - if (data.liveStatus != 1) { + if (res case Success(:final response)) { + if (response.liveStatus != 1) { _showDialog('当前直播间未开播'); return; } - if (data.playurlInfo?.playurl == null) { + if (response.playurlInfo?.playurl == null) { _showDialog('无法获取播放地址'); return; } - ruid = data.uid; - if (data.roomId != null) { - roomId = data.roomId!; + ruid = response.uid; + if (response.roomId != null) { + roomId = response.roomId!; } - liveTime.value = data.liveTime; + liveTime.value = response.liveTime; startLiveTimer(); - isPortrait.value = data.isPortrait ?? false; + isPortrait.value = response.isPortrait ?? false; List codec = - data.playurlInfo!.playurl!.stream!.first.format!.first.codec!; + response.playurlInfo!.playurl!.stream!.first.format!.first.codec!; CodecItem item = codec.first; // 以服务端返回的码率为准 currentQn = item.currentQn!; @@ -261,12 +261,11 @@ class LiveRoomController extends GetxController { Future queryLiveInfoH5() async { final res = await LiveHttp.liveRoomInfoH5(roomId: roomId); - if (res.isSuccess) { - final data = res.data; - roomInfoH5.value = data; - title.value = data.roomInfo?.title ?? ''; - watchedShow.value = data.watchedShow?.textLarge; - videoPlayerServiceHandler?.onVideoDetailChange(data, roomId, heroTag); + if (res case Success(:final response)) { + roomInfoH5.value = response; + title.value = response.roomInfo?.title ?? ''; + watchedShow.value = response.watchedShow?.textLarge; + videoPlayerServiceHandler?.onVideoDetailChange(response, roomId, heroTag); } else { res.toast(); } @@ -358,8 +357,8 @@ class LiveRoomController extends GetxController { return; } LiveHttp.liveRoomGetDanmakuToken(roomId: roomId).then((res) { - if (res.isSuccess) { - initDm(dmInfo = res.data); + if (res case Success(:final response)) { + initDm(dmInfo = response); } }); } diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index 66ba76cab..5debcee03 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -74,7 +74,7 @@ class LoginPageController extends GetxController Future refreshQRCode() async { final res = await LoginHttp.getHDcode(); - if (res.isSuccess) { + if (res case Success(:final response)) { qrCodeTimer?.cancel(); codeInfo.value = res; qrCodeTimer = Timer.periodic(const Duration(milliseconds: 1000), (t) { @@ -89,7 +89,7 @@ class LoginPageController extends GetxController if (_isReq || tabController.index != 2) return; _isReq = true; - LoginHttp.codePoll(res.data.authCode).then((value) async { + LoginHttp.codePoll(response.authCode).then((value) async { _isReq = false; if (value['status']) { t.cancel(); diff --git a/lib/pages/login/geetest/geetest_webview_dialog.dart b/lib/pages/login/geetest/geetest_webview_dialog.dart index 445346211..b63d9cd24 100644 --- a/lib/pages/login/geetest/geetest_webview_dialog.dart +++ b/lib/pages/login/geetest/geetest_webview_dialog.dart @@ -109,10 +109,10 @@ class GeetestWebviewDialog extends StatelessWidget { }, onLoadStop: (ctr, _) async { final config = await future; - if (config.isSuccess) { + if (config case Success(:final response)) { ctr.evaluateJavascript( source: - 'let t=Geetest(${config.data}).onSuccess(()=>R("success",t.getValidate())).onError((o)=>R("error",o));t.onReady(()=>t.verify());', + 'let t=Geetest($response).onSuccess(()=>R("success",t.getValidate())).onError((o)=>R("error",o));t.onReady(()=>t.verify());', ); } else { config.toast(); diff --git a/lib/pages/match_info/view.dart b/lib/pages/match_info/view.dart index 2d8561870..c88f70d00 100644 --- a/lib/pages/match_info/view.dart +++ b/lib/pages/match_info/view.dart @@ -67,9 +67,8 @@ class _MatchInfoPageState extends CommonDynPageState { } Widget _buildInfo(ThemeData theme, LoadingState infoState) { - if (infoState.isSuccess) { - MatchContest? data = infoState.dataOrNull; - if (data != null) { + if (infoState case Success(:final response)) { + if (response != null) { try { Widget teamInfo(MatchTeam team) { return Column( @@ -96,7 +95,7 @@ class _MatchInfoPageState extends CommonDynPageState { children: [ Center( child: Text( - '${data.season?.title ?? ''} ${data.gameStage ?? ''}', + '${response.season?.title ?? ''} ${response.gameStage ?? ''}', ), ), Row( @@ -104,35 +103,36 @@ class _MatchInfoPageState extends CommonDynPageState { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (data.homeId != 0) + if (response.homeId != 0) Expanded( child: Align( alignment: const Alignment(0.8, 1), - child: teamInfo(data.homeTeam!), + child: teamInfo(response.homeTeam!), ), ), Column( spacing: 10, mainAxisSize: MainAxisSize.min, children: [ - if (data.homeId != 0) + if (response.homeId != 0) Text( - data.contestStatus == 1 + response.contestStatus == 1 ? 'VS' - : '${data.homeScore} : ${data.awayScore}', + : '${response.homeScore} : ${response.awayScore}', style: const TextStyle( fontSize: 25, fontWeight: FontWeight.bold, ), ) - else if (data.season?.logo != null) + else if (response.season?.logo != null) NetworkImgLayer( width: 50, height: 50, - src: 'https://i1.hdslb.com${data.season!.logo}', + src: + 'https://i1.hdslb.com${response.season!.logo}', type: ImageType.emote, ), - if (data.contestStatus == 2) + if (response.contestStatus == 2) FilledButton.tonal( style: FilledButton.styleFrom( padding: const EdgeInsets.symmetric( @@ -147,20 +147,20 @@ class _MatchInfoPageState extends CommonDynPageState { tapTargetSize: MaterialTapTargetSize.shrinkWrap, ), onPressed: () => - PageUtils.toLiveRoom(data.liveRoom), + PageUtils.toLiveRoom(response.liveRoom), child: const Text('看直播'), ) - else if (data.contestStatus == 3) + else if (response.contestStatus == 3) Text( - '${DateFormatUtils.dateFormat(data.stime)}${data.contestStatus == 3 ? ' 已结束' : ''}', + '${DateFormatUtils.dateFormat(response.stime)}${response.contestStatus == 3 ? ' 已结束' : ''}', style: TextStyle( color: theme.colorScheme.outline, ), ) - else if (data.contestStatus == 1) + else if (response.contestStatus == 1) Text( DateFormatUtils.format( - data.stime, + response.stime, format: DateFormat('yy-MM-dd HH:mm'), ), style: TextStyle( @@ -169,11 +169,11 @@ class _MatchInfoPageState extends CommonDynPageState { ), ], ), - if (data.awayId != 0) + if (response.awayId != 0) Expanded( child: Align( alignment: const Alignment(-0.8, -1), - child: teamInfo(data.awayTeam!), + child: teamInfo(response.awayTeam!), ), ), ], diff --git a/lib/pages/member_video/controller.dart b/lib/pages/member_video/controller.dart index e99b0ef4b..32ae7968b 100644 --- a/lib/pages/member_video/controller.dart +++ b/lib/pages/member_video/controller.dart @@ -96,12 +96,14 @@ class MemberVideoCtr count.value = type == ContributeType.season ? (data.item?.length ?? -1) : (data.count ?? -1); - if (page != 0 && loadingState.value.isSuccess) { - data.item ??= []; - if (isLoadPrevious) { - data.item!.addAll(loadingState.value.data!); - } else { - data.item!.insertAll(0, loadingState.value.data!); + if (page != 0) { + if (loadingState.value case Success(:final response)) { + data.item ??= []; + if (isLoadPrevious) { + data.item!.addAll(response!); + } else { + data.item!.insertAll(0, response!); + } } } firstAid = data.item?.firstOrNull?.param; diff --git a/lib/pages/mine/controller.dart b/lib/pages/mine/controller.dart index ca65793e5..0bc75092e 100644 --- a/lib/pages/mine/controller.dart +++ b/lib/pages/mine/controller.dart @@ -100,15 +100,14 @@ class MineController extends CommonDataController Future queryUserInfo() async { final res = await UserHttp.userInfo(); - if (res.isSuccess) { - UserInfoData data = res.data; - if (data.isLogin == true) { - userInfo.value = data; - if (data != Pref.userInfoCache) { - GStorage.userInfo.put('userInfoCache', data); + if (res case Success(:final response)) { + if (response.isLogin == true) { + userInfo.value = response; + if (response != Pref.userInfoCache) { + GStorage.userInfo.put('userInfoCache', response); } accountService - ..face.value = data.face! + ..face.value = response.face! ..isLogin.value = true; } else { LoginUtils.onLogoutMain(); diff --git a/lib/pages/msg_feed_top/like_me/controller.dart b/lib/pages/msg_feed_top/like_me/controller.dart index f9de1f08f..2d740a029 100644 --- a/lib/pages/msg_feed_top/like_me/controller.dart +++ b/lib/pages/msg_feed_top/like_me/controller.dart @@ -43,10 +43,11 @@ class LikeMeController cursorTime = data.total?.cursor?.time; List latest = data.latest?.items ?? []; List total = data.total?.items ?? []; - if (!isRefresh && loadingState.value.isSuccess) { - Pair, List> pair = loadingState.value.data; - latest.insertAll(0, pair.first); - total.insertAll(0, pair.second); + if (!isRefresh) { + if (loadingState.value case Success(:final response)) { + latest.insertAll(0, response.first); + total.insertAll(0, response.second); + } } loadingState.value = Success(Pair(first: latest, second: total)); return true; diff --git a/lib/pages/music/controller.dart b/lib/pages/music/controller.dart index 5b08f48e9..b7e6c62af 100644 --- a/lib/pages/music/controller.dart +++ b/lib/pages/music/controller.dart @@ -32,8 +32,8 @@ class MusicDetailController extends CommonDynController { Future getMusicDetail() async { final res = await MusicHttp.bgmDetail(musicId); - if (res.isSuccess) { - final comment = res.data.musicComment!; + if (res case Success(:final response)) { + final comment = response.musicComment!; oid = comment.oid!; replyType = comment.pageType ?? 47; count.value = comment.nums ?? -1; diff --git a/lib/pages/music/view.dart b/lib/pages/music/view.dart index c5f58cb1b..51a859c56 100644 --- a/lib/pages/music/view.dart +++ b/lib/pages/music/view.dart @@ -71,29 +71,29 @@ class _MusicDetailPageState extends CommonDynPageState { padding: const EdgeInsets.only(right: 12), child: Obx( () { - final info = controller.infoState.value; - late final showTitle = controller.showTitle.value; - return info.isSuccess - ? AnimatedOpacity( - opacity: showTitle ? 1 : 0, - duration: const Duration(milliseconds: 300), - child: IgnorePointer( - ignoring: !showTitle, - child: Row( - spacing: 8, - children: [ - NetworkImgLayer( - src: info.data.mvCover, - width: 36, - height: 36, - type: ImageType.avatar, - ), - Text(info.data.musicTitle!), - ], + if (controller.infoState.value case Success(:final response)) { + final showTitle = controller.showTitle.value; + return AnimatedOpacity( + opacity: showTitle ? 1 : 0, + duration: const Duration(milliseconds: 300), + child: IgnorePointer( + ignoring: !showTitle, + child: Row( + spacing: 8, + children: [ + NetworkImgLayer( + src: response.mvCover, + width: 36, + height: 36, + type: ImageType.avatar, ), - ), - ) - : const SizedBox(height: 40); + Text(response.musicTitle!), + ], + ), + ), + ); + } + return const SizedBox.shrink(); }, ), ), diff --git a/lib/pages/pgc/controller.dart b/lib/pages/pgc/controller.dart index 189bb1e26..032f28957 100644 --- a/lib/pages/pgc/controller.dart +++ b/lib/pages/pgc/controller.dart @@ -2,7 +2,6 @@ import 'package:PiliPlus/http/fav.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/pgc.dart'; import 'package:PiliPlus/models/common/home_tab_type.dart'; -import 'package:PiliPlus/models_new/fav/fav_pgc/data.dart'; import 'package:PiliPlus/models_new/fav/fav_pgc/list.dart'; import 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart'; import 'package:PiliPlus/models_new/pgc/pgc_timeline/result.dart'; @@ -100,10 +99,9 @@ class PgcController pn: followPage, ); - if (res.isSuccess) { - FavPgcData data = res.data; - List? list = data.list; - followCount.value = data.total ?? -1; + if (res case Success(:final response)) { + final list = response.list; + followCount.value = response.total ?? -1; if (list == null || list.isEmpty) { followEnd = true; @@ -120,8 +118,8 @@ class PgcController } followState.value = Success(list); followController?.animToTop(); - } else if (followState.value.isSuccess) { - final currentList = followState.value.data!..addAll(list); + } else if (followState.value case Success(:final response)) { + final currentList = response!..addAll(list); if (currentList.length >= followCount.value) { followEnd = true; } diff --git a/lib/pages/pgc_index/controller.dart b/lib/pages/pgc_index/controller.dart index 4d0c4de1a..a43bc1cbe 100644 --- a/lib/pages/pgc_index/controller.dart +++ b/lib/pages/pgc_index/controller.dart @@ -30,13 +30,12 @@ class PgcIndexController type: 0, indexType: indexType, ); - if (res.isSuccess) { - PgcIndexConditionData data = res.data; - if (data.order?.isNotEmpty == true) { - indexParams['order'] = data.order!.first.field; + if (res case Success(:final response)) { + if (response.order?.isNotEmpty == true) { + indexParams['order'] = response.order!.first.field; } - if (data.filter?.isNotEmpty == true) { - for (PgcConditionFilter item in data.filter!) { + if (response.filter?.isNotEmpty == true) { + for (PgcConditionFilter item in response.filter!) { indexParams['${item.field}'] = item.values?.firstOrNull?.keyword; } } diff --git a/lib/pages/popular_series/controller.dart b/lib/pages/popular_series/controller.dart index 56661922f..cf58a5451 100644 --- a/lib/pages/popular_series/controller.dart +++ b/lib/pages/popular_series/controller.dart @@ -26,11 +26,10 @@ class PopularSeriesController Future _getSeriesList() async { final res = await VideoHttp.popularSeriesList(); - if (res.isSuccess) { - final list = res.data; - if (list != null && list.isNotEmpty) { - number = list.first.number!; - seriesList = list; + if (res case Success(:final response)) { + if (response != null && response.isNotEmpty) { + number = response.first.number!; + seriesList = response; queryData(); } else { loadingState.value = const Success(null); diff --git a/lib/pages/rcmd/controller.dart b/lib/pages/rcmd/controller.dart index 72c1e5539..061e6d69c 100644 --- a/lib/pages/rcmd/controller.dart +++ b/lib/pages/rcmd/controller.dart @@ -26,16 +26,18 @@ class RcmdController extends CommonListController { @override void handleListResponse(List dataList) { - if (enableSaveLastData && page == 0 && loadingState.value.isSuccess) { - final currentList = loadingState.value.data; - if (currentList != null && currentList.isNotEmpty) { - if (savedRcmdTip) { - lastRefreshAt = dataList.length; + if (enableSaveLastData && page == 0) { + if (loadingState.value case Success(:final response)) { + if (response != null && response.isNotEmpty) { + if (savedRcmdTip) { + lastRefreshAt = dataList.length; + } + if (response.length > 200) { + dataList.addAll(response.take(50)); + } else { + dataList.addAll(response); + } } - if (currentList.length > 200) { - currentList.length = 50; - } - dataList.addAll(currentList); } } } diff --git a/lib/pages/setting/models/extra_settings.dart b/lib/pages/setting/models/extra_settings.dart index d91b2f90c..17a2c1fcc 100644 --- a/lib/pages/setting/models/extra_settings.dart +++ b/lib/pages/setting/models/extra_settings.dart @@ -8,6 +8,7 @@ import 'package:PiliPlus/common/widgets/image/custom_grid_view.dart' import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; import 'package:PiliPlus/grpc/reply.dart'; import 'package:PiliPlus/http/fav.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/audio_normalization.dart'; import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart'; import 'package:PiliPlus/models/common/member/tab_type.dart'; @@ -792,8 +793,8 @@ List get extraSettings => [ onTap: (context) async { if (Accounts.main.isLogin) { final res = await FavHttp.allFavFolders(Accounts.main.mid); - if (res.isSuccess) { - final list = res.data.list; + if (res case Success(:final response)) { + final list = response.list; if (list == null || list.isEmpty) { return; } diff --git a/lib/pages/setting/models/style_settings.dart b/lib/pages/setting/models/style_settings.dart index db359ee08..0668ecd0d 100644 --- a/lib/pages/setting/models/style_settings.dart +++ b/lib/pages/setting/models/style_settings.dart @@ -225,12 +225,14 @@ List get styleSettings => [ leading: Icon(Icons.people_alt_outlined), setKey: SettingBoxKey.dynamicsShowAllFollowedUp, defaultVal: false, + needReboot: true, ), const SwitchModel( title: '动态页展开正在直播UP列表', leading: Icon(Icons.live_tv), setKey: SettingBoxKey.expandDynLivePanel, defaultVal: false, + needReboot: true, ), NormalModel( onTap: (context, setState) async { diff --git a/lib/pages/setting/pages/font_size_select.dart b/lib/pages/setting/pages/font_size_select.dart index 418748c54..f71d5260b 100644 --- a/lib/pages/setting/pages/font_size_select.dart +++ b/lib/pages/setting/pages/font_size_select.dart @@ -22,7 +22,7 @@ class _FontSizeSelectPageState extends State { GStorage.setting.put(SettingBoxKey.defaultTextScale, currentSize); Get ..back(result: currentSize) - ..forceAppUpdate(); + ..appUpdate(); } @override diff --git a/lib/pages/space_setting/controller.dart b/lib/pages/space_setting/controller.dart index c2f31b445..08905c7fd 100644 --- a/lib/pages/space_setting/controller.dart +++ b/lib/pages/space_setting/controller.dart @@ -28,18 +28,19 @@ class SpaceSettingController UserHttp.spaceSetting(); Future onMod() async { - if ((hasMod ?? false) && loadingState.value.isSuccess) { - Privacy? data = loadingState.value.data; - if (data != null) { - final res = await UserHttp.spaceSettingMod( - { - for (final e in data.list1) e.key: e.value, - for (final e in data.list2) e.key: e.value, - for (final e in data.list3) e.key: e.value, - }, - ); - if (!res.isSuccess) { - res.toast(); + if (hasMod ?? false) { + if (loadingState.value case Success(:final response)) { + if (response != null) { + final res = await UserHttp.spaceSettingMod( + { + for (final e in response.list1) e.key: e.value, + for (final e in response.list2) e.key: e.value, + for (final e in response.list3) e.key: e.value, + }, + ); + if (!res.isSuccess) { + res.toast(); + } } } } diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index b49d6ead9..558e36d49 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -1160,11 +1160,11 @@ class VideoDetailController extends GetxController seasonId: isUgc ? null : seasonId, pgcType: isUgc ? null : pgcType, videoType: videoType, - onInit: () async { + onInit: () { if (videoState.value is! Success) { videoState.value = const Success(null); } - await setSubtitle(vttSubtitlesIndex.value); + setSubtitle(vttSubtitlesIndex.value); }, width: firstVideo.width, height: firstVideo.height, @@ -1243,8 +1243,8 @@ class VideoDetailController extends GetxController language: currLang.value, ); - if (result.isSuccess) { - data = result.data; + if (result case Success(:final response)) { + data = response; languages.value = data.language?.items; currLang.value = data.curLanguage; @@ -1979,9 +1979,8 @@ class VideoDetailController extends GetxController qn: currentVideoQa.value?.code, ); SmartDialog.dismiss(); - if (res.isSuccess) { - final data = res.data; - final first = data.durl?.firstOrNull; + if (res case Success(:final response)) { + final first = response.durl?.firstOrNull; if (first == null || first.playUrls.isEmpty) { SmartDialog.showToast('不支持投屏'); return; diff --git a/lib/pages/video/introduction/ugc/controller.dart b/lib/pages/video/introduction/ugc/controller.dart index dfdbdc776..f0c030e0f 100644 --- a/lib/pages/video/introduction/ugc/controller.dart +++ b/lib/pages/video/introduction/ugc/controller.dart @@ -13,7 +13,6 @@ import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/common/video/source_type.dart'; import 'package:PiliPlus/models_new/member_card_info/data.dart'; import 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart'; -import 'package:PiliPlus/models_new/video/video_detail/data.dart'; import 'package:PiliPlus/models_new/video/video_detail/episode.dart'; import 'package:PiliPlus/models_new/video/video_detail/page.dart'; import 'package:PiliPlus/models_new/video/video_detail/section.dart'; @@ -29,7 +28,6 @@ import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; -import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/global_data.dart'; @@ -90,30 +88,33 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { Future queryVideoIntro() async { queryVideoTags(); final res = await VideoHttp.videoIntro(bvid: bvid); - if (res.isSuccess) { - VideoDetailData data = res.data; - videoPlayerServiceHandler?.onVideoDetailChange(data, cid.value, heroTag); - if (videoDetail.value.ugcSeason?.id == data.ugcSeason?.id) { + if (res case Success(:final response)) { + videoPlayerServiceHandler?.onVideoDetailChange( + response, + cid.value, + heroTag, + ); + if (videoDetail.value.ugcSeason?.id == response.ugcSeason?.id) { // keep reversed season - data.ugcSeason = videoDetail.value.ugcSeason; + response.ugcSeason = videoDetail.value.ugcSeason; } - if (videoDetail.value.cid == data.cid) { + if (videoDetail.value.cid == response.cid) { // keep reversed pages - data + response ..pages = videoDetail.value.pages ..isPageReversed = videoDetail.value.isPageReversed; } - videoDetail.value = data; + videoDetail.value = response; try { if (videoDetailCtr.cover.value.isEmpty || (videoDetailCtr.videoUrl.isNullOrEmpty && !videoDetailCtr.isQuerying)) { - videoDetailCtr.cover.value = data.pic ?? ''; + videoDetailCtr.cover.value = response.pic ?? ''; } if (videoDetailCtr.showReply) { try { Get.find(tag: heroTag).count.value = - data.stat?.reply ?? 0; + response.stat?.reply ?? 0; } catch (_) {} } } catch (_) {} @@ -121,7 +122,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { if (pages != null && pages.isNotEmpty && cid.value == 0) { cid.value = pages.first.cid!; } - queryUserStat(data.staff); + queryUserStat(response.staff); } else { res.toast(); status.value = false; @@ -136,27 +137,21 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { // 获取up主粉丝数 Future queryUserStat(List? staff) async { if (staff != null && staff.isNotEmpty) { - Request() - .get( - Api.relations, - queryParameters: {'fids': staff.map((item) => item.mid).join(',')}, - ) - .then((res) { - if (res.data['code'] == 0) { - staffRelations.addAll({ - 'status': true, - if (res.data['data'] != null) ...res.data['data'], - }); - } - }); + final res = await Request().get( + Api.relations, + queryParameters: {'fids': staff.map((item) => item.mid).join(',')}, + ); + if (res.data['code'] == 0) { + staffRelations.addAll({'status': true, ...?res.data['data']}); + } } else { final mid = videoDetail.value.owner?.mid; if (mid == null) { return; } - final result = await MemberHttp.memberCardInfo(mid: mid); - if (result.isSuccess) { - userStat.value = result.data; + final res = await MemberHttp.memberCardInfo(mid: mid); + if (res case Success(:final response)) { + userStat.value = response; } } } @@ -247,11 +242,11 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { SmartDialog.showToast('账号未登录'); return; } - final result = await VideoHttp.dislikeVideo( + final res = await VideoHttp.dislikeVideo( bvid: bvid, type: !hasDislike.value, ); - if (result.isSuccess) { + if (res.isSuccess) { if (!hasDislike.value) { SmartDialog.showToast('点踩成功'); hasDislike.value = true; @@ -264,7 +259,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { hasDislike.value = false; } } else { - result.toast(); + res.toast(); } } @@ -727,25 +722,24 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { return false; } - if (relatedCtr.loadingState.value is! Success) { - return false; + if (relatedCtr.loadingState.value case Success(:final response)) { + final firstItem = response?.firstOrNull; + if (firstItem == null) { + SmartDialog.showToast('暂无相关视频,停止连播'); + return false; + } + onChangeEpisode( + BaseEpisodeItem( + aid: firstItem.aid, + bvid: firstItem.bvid, + cid: firstItem.cid, + cover: firstItem.cover, + ), + ); + return true; } - if (relatedCtr.loadingState.value.data.isNullOrEmpty) { - SmartDialog.showToast('暂无相关视频,停止连播'); - return false; - } - - final firstItem = relatedCtr.loadingState.value.data!.first; - onChangeEpisode( - BaseEpisodeItem( - aid: firstItem.aid, - bvid: firstItem.bvid, - cid: firstItem.cid, - cover: firstItem.cover, - ), - ); - return true; + return false; } // ai总结 diff --git a/lib/pages/video/member/controller.dart b/lib/pages/video/member/controller.dart index 63bc59ab8..f8ecef20a 100644 --- a/lib/pages/video/member/controller.dart +++ b/lib/pages/video/member/controller.dart @@ -63,12 +63,14 @@ class HorizontalMemberPageController hasNext = data.hasNext ?? false; } } - if (isLoadPrevious && loadingState.value.isSuccess) { - data.item ??= []; - data.item!.addAll(loadingState.value.data!); - } else if (!isRefresh && loadingState.value.isSuccess) { - data.item ??= []; - data.item!.insertAll(0, loadingState.value.data!); + if (isLoadPrevious) { + if (loadingState.value case Success(:final response)) { + (data.item ??= []).addAll(response!); + } + } else if (!isRefresh) { + if (loadingState.value case Success(:final response)) { + (data.item ??= []).insertAll(0, response!); + } } firstAid = data.item?.firstOrNull?.param; lastAid = data.item?.lastOrNull?.param; diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index dacad763a..bd5eb6e27 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -921,17 +921,17 @@ class ReplyItemGrpc extends StatelessWidget { return; } SmartDialog.showLoading(msg: '删除中...'); - final result = await VideoHttp.replyDel( + final res = await VideoHttp.replyDel( type: item.type.toInt(), oid: item.oid.toInt(), rpid: item.id.toInt(), ); SmartDialog.dismiss(); - if (result.isSuccess) { + if (res.isSuccess) { SmartDialog.showToast('删除成功'); onDelete(); } else { - SmartDialog.showToast('删除失败, $result'); + SmartDialog.showToast('删除失败, $res'); } }, minLeadingWidth: 0, diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index 09040a77b..6913bbc5c 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -208,12 +208,15 @@ class HeaderControl extends StatefulWidget { return true; } else { res.toast(); - if ((res as Error).code == 65006) { - extra.isLike = true; - return true; - } else if (res.code == 65004) { - extra.isLike = false; - return true; + if (res case Error(:final code)) { + if (code == 65006) { + extra.isLike = true; + return true; + } + if (code == 65004) { + extra.isLike = false; + return true; + } } return false; } diff --git a/lib/pages/whisper/controller.dart b/lib/pages/whisper/controller.dart index 23b82d2c9..4a3183915 100644 --- a/lib/pages/whisper/controller.dart +++ b/lib/pages/whisper/controller.dart @@ -59,8 +59,8 @@ class WhisperController extends CommonWhisperController { Future queryMsgFeedUnread() async { final res = await ImGrpc.getTotalUnread(unreadType: 2); - if (res.isSuccess) { - final data = MsgFeedUnread.fromJson(res.data.msgFeedUnread.unread); + if (res case Success(:final response)) { + final data = MsgFeedUnread.fromJson(response.msgFeedUnread.unread); final unreadCounts = [data.reply, data.at, data.like, data.sysMsg]; if (!listEquals(this.unreadCounts, unreadCounts)) { this.unreadCounts.value = unreadCounts; diff --git a/lib/pages/whisper_detail/controller.dart b/lib/pages/whisper_detail/controller.dart index 34d1f6525..6fa509f56 100644 --- a/lib/pages/whisper_detail/controller.dart +++ b/lib/pages/whisper_detail/controller.dart @@ -82,7 +82,7 @@ class WhisperDetailController extends CommonListController { SmartDialog.showToast('请先登录'); return; } - final result = await ImGrpc.sendMsg( + final res = await ImGrpc.sendMsg( senderUid: account.mid, receiverId: mid!, content: msgType == 5 @@ -91,7 +91,7 @@ class WhisperDetailController extends CommonListController { msgType: MsgType.values[msgType ?? (picMsg != null ? 2 : 1)], ); SmartDialog.dismiss(); - if (result.isSuccess) { + if (res.isSuccess) { if (msgType == 5) { loadingState ..value.data![index!].msgStatus = 1 @@ -103,7 +103,7 @@ class WhisperDetailController extends CommonListController { SmartDialog.showToast('发送成功'); } } else { - result.toast(); + res.toast(); } _isSending = false; } diff --git a/lib/pages/whisper_link_setting/controller.dart b/lib/pages/whisper_link_setting/controller.dart index 4244780fd..32679c05a 100644 --- a/lib/pages/whisper_link_setting/controller.dart +++ b/lib/pages/whisper_link_setting/controller.dart @@ -55,8 +55,8 @@ class WhisperLinkSettingController extends GetxController { Future getIsPinned() async { final res = await ImGrpc.sessionUpdate(sessionId: sessionId); - if (res.isSuccess) { - isPinned.value = res.data.session.isPinned; + if (res case Success(:final response)) { + isPinned.value = response.session.isPinned; } } diff --git a/lib/pages/whisper_link_setting/view.dart b/lib/pages/whisper_link_setting/view.dart index c85f63d47..3510c17f2 100644 --- a/lib/pages/whisper_link_setting/view.dart +++ b/lib/pages/whisper_link_setting/view.dart @@ -61,11 +61,12 @@ class _WhisperLinkSettingPageState extends State { ), ), Obx( - () => _controller.sessionSs.value.isSuccess - ? _buildBlockItem( - _controller.sessionSs.value.data.followStatus == 128, - ) - : const SizedBox.shrink(), + () { + if (_controller.sessionSs.value case Success(:final response)) { + return _buildBlockItem(response.followStatus == 128); + } + return const SizedBox.shrink(); + }, ), divider2, ListTile( diff --git a/lib/pages/whisper_settings/controller.dart b/lib/pages/whisper_settings/controller.dart index 10995b605..6cc41a4b6 100644 --- a/lib/pages/whisper_settings/controller.dart +++ b/lib/pages/whisper_settings/controller.dart @@ -40,7 +40,8 @@ class WhisperSettingsController final res = await ImGrpc.setImSettings(settings: settings); if (!res.isSuccess) { res.toast(); + return false; } - return res.isSuccess; + return true; } } diff --git a/lib/router/app_pages.dart b/lib/router/app_pages.dart index 0c7fb26af..22292df3d 100644 --- a/lib/router/app_pages.dart +++ b/lib/router/app_pages.dart @@ -75,169 +75,120 @@ import 'package:get/get.dart'; class Routes { static final List> getPages = [ - CustomGetPage(name: '/', page: () => const MainApp()), + GetPage(name: '/', page: () => const MainApp()), // 首页(推荐) - CustomGetPage(name: '/home', page: () => const HomePage()), + GetPage(name: '/home', page: () => const HomePage()), // 热门 - CustomGetPage(name: '/hot', page: () => const HotPage()), + GetPage(name: '/hot', page: () => const HotPage()), // 视频详情 - CustomGetPage(name: '/videoV', page: () => const VideoDetailPageV()), + GetPage(name: '/videoV', page: () => const VideoDetailPageV()), // - CustomGetPage(name: '/webview', page: () => const WebviewPage()), + GetPage(name: '/webview', page: () => const WebviewPage()), // 设置 - CustomGetPage(name: '/setting', page: () => const SettingPage()), + GetPage(name: '/setting', page: () => const SettingPage()), // - CustomGetPage(name: '/fav', page: () => const FavPage()), + GetPage(name: '/fav', page: () => const FavPage()), // - CustomGetPage(name: '/favDetail', page: () => const FavDetailPage()), + GetPage(name: '/favDetail', page: () => const FavDetailPage()), // 稍后再看 - CustomGetPage(name: '/later', page: () => const LaterPage()), + GetPage(name: '/later', page: () => const LaterPage()), // 历史记录 - CustomGetPage(name: '/history', page: () => const HistoryPage()), + GetPage(name: '/history', page: () => const HistoryPage()), // 搜索页面 - CustomGetPage(name: '/search', page: () => const SearchPage()), + GetPage(name: '/search', page: () => const SearchPage()), // 搜索结果 - CustomGetPage(name: '/searchResult', page: () => const SearchResultPage()), + GetPage(name: '/searchResult', page: () => const SearchResultPage()), // 动态 - CustomGetPage(name: '/dynamics', page: () => const DynamicsPage()), + GetPage(name: '/dynamics', page: () => const DynamicsPage()), // 动态详情 - CustomGetPage( - name: '/dynamicDetail', - page: () => const DynamicDetailPage(), - ), + GetPage(name: '/dynamicDetail', page: () => const DynamicDetailPage()), // 关注 - CustomGetPage(name: '/follow', page: () => const FollowPage()), + GetPage(name: '/follow', page: () => const FollowPage()), // 粉丝 - CustomGetPage(name: '/fan', page: () => const FansPage()), + GetPage(name: '/fan', page: () => const FansPage()), // 直播详情 - CustomGetPage(name: '/liveRoom', page: () => const LiveRoomPage()), + GetPage(name: '/liveRoom', page: () => const LiveRoomPage()), // 用户中心 - CustomGetPage(name: '/member', page: () => const MemberPage()), - CustomGetPage(name: '/memberSearch', page: () => const MemberSearchPage()), + GetPage(name: '/member', page: () => const MemberPage()), + GetPage(name: '/memberSearch', page: () => const MemberSearchPage()), // 推荐流设置 - CustomGetPage( - name: '/recommendSetting', - page: () => const RecommendSetting(), - ), + GetPage(name: '/recommendSetting', page: () => const RecommendSetting()), // 音视频设置 - CustomGetPage(name: '/videoSetting', page: () => const VideoSetting()), + GetPage(name: '/videoSetting', page: () => const VideoSetting()), // 播放器设置 - CustomGetPage(name: '/playSetting', page: () => const PlaySetting()), + GetPage(name: '/playSetting', page: () => const PlaySetting()), // 外观设置 - CustomGetPage(name: '/styleSetting', page: () => const StyleSetting()), + GetPage(name: '/styleSetting', page: () => const StyleSetting()), // 隐私设置 - CustomGetPage(name: '/privacySetting', page: () => const PrivacySetting()), + GetPage(name: '/privacySetting', page: () => const PrivacySetting()), // 其它设置 - CustomGetPage(name: '/extraSetting', page: () => const ExtraSetting()), + GetPage(name: '/extraSetting', page: () => const ExtraSetting()), // - CustomGetPage(name: '/blackListPage', page: () => const BlackListPage()), - CustomGetPage(name: '/colorSetting', page: () => const ColorSelectPage()), - CustomGetPage( - name: '/fontSizeSetting', - page: () => const FontSizeSelectPage(), - ), + GetPage(name: '/blackListPage', page: () => const BlackListPage()), + GetPage(name: '/colorSetting', page: () => const ColorSelectPage()), + GetPage(name: '/fontSizeSetting', page: () => const FontSizeSelectPage()), // 屏幕帧率 - CustomGetPage( - name: '/displayModeSetting', - page: () => const SetDisplayMode(), - ), + GetPage(name: '/displayModeSetting', page: () => const SetDisplayMode()), // 关于 - CustomGetPage(name: '/about', page: () => const AboutPage()), + GetPage(name: '/about', page: () => const AboutPage()), // - CustomGetPage(name: '/articlePage', page: () => const ArticlePage()), + GetPage(name: '/articlePage', page: () => const ArticlePage()), // 历史记录搜索 - CustomGetPage(name: '/playSpeedSet', page: () => const PlaySpeedPage()), + GetPage(name: '/playSpeedSet', page: () => const PlaySpeedPage()), // 收藏搜索 - CustomGetPage(name: '/favSearch', page: () => const FavSearchPage()), - CustomGetPage( - name: '/historySearch', - page: () => const HistorySearchPage(), - ), - CustomGetPage(name: '/laterSearch', page: () => const LaterSearchPage()), - CustomGetPage(name: '/followSearch', page: () => const FollowSearchPage()), + GetPage(name: '/favSearch', page: () => const FavSearchPage()), + GetPage(name: '/historySearch', page: () => const HistorySearchPage()), + GetPage(name: '/laterSearch', page: () => const LaterSearchPage()), + GetPage(name: '/followSearch', page: () => const FollowSearchPage()), // 消息页面 - CustomGetPage(name: '/whisper', page: () => const WhisperPage()), + GetPage(name: '/whisper', page: () => const WhisperPage()), // 私信详情 - CustomGetPage( - name: '/whisperDetail', - page: () => const WhisperDetailPage(), - ), + GetPage(name: '/whisperDetail', page: () => const WhisperDetailPage()), // 回复我的 - CustomGetPage(name: '/replyMe', page: () => const ReplyMePage()), + GetPage(name: '/replyMe', page: () => const ReplyMePage()), // @我的 - CustomGetPage(name: '/atMe', page: () => const AtMePage()), + GetPage(name: '/atMe', page: () => const AtMePage()), // 收到的赞 - CustomGetPage(name: '/likeMe', page: () => const LikeMePage()), + GetPage(name: '/likeMe', page: () => const LikeMePage()), // 系统消息 - CustomGetPage(name: '/sysMsg', page: () => const SysMsgPage()), + GetPage(name: '/sysMsg', page: () => const SysMsgPage()), // 登录页面 - CustomGetPage(name: '/loginPage', page: () => const LoginPage()), + GetPage(name: '/loginPage', page: () => const LoginPage()), // 用户动态 - CustomGetPage( - name: '/memberDynamics', - page: () => const MemberDynamicsPage(), - ), + GetPage(name: '/memberDynamics', page: () => const MemberDynamicsPage()), // 日志 - CustomGetPage(name: '/logs', page: () => const LogsPage()), + GetPage(name: '/logs', page: () => const LogsPage()), // 订阅 - CustomGetPage(name: '/subscription', page: () => const SubPage()), + GetPage(name: '/subscription', page: () => const SubPage()), // 订阅详情 - CustomGetPage(name: '/subDetail', page: () => const SubDetailPage()), + GetPage(name: '/subDetail', page: () => const SubDetailPage()), // 弹幕屏蔽管理 - CustomGetPage(name: '/danmakuBlock', page: () => const DanmakuBlockPage()), - CustomGetPage(name: '/sponsorBlock', page: () => const SponsorBlockPage()), - CustomGetPage(name: '/createFav', page: () => const CreateFavPage()), - CustomGetPage(name: '/editProfile', page: () => const EditProfilePage()), - CustomGetPage( - name: '/settingsSearch', - page: () => const SettingsSearchPage(), - ), - CustomGetPage( - name: '/webdavSetting', - page: () => const WebDavSettingPage(), - ), - CustomGetPage( - name: '/searchTrending', - page: () => const SearchTrendingPage(), - ), - CustomGetPage(name: '/dynTopic', page: () => const DynTopicPage()), - CustomGetPage(name: '/articleList', page: () => const ArticleListPage()), - CustomGetPage(name: '/barSetting', page: () => const BarSetPage()), - CustomGetPage(name: '/upowerRank', page: () => const UpowerRankPage()), - CustomGetPage(name: '/spaceSetting', page: () => const SpaceSettingPage()), - CustomGetPage(name: '/dynTopicRcmd', page: () => const DynTopicRcmdPage()), - CustomGetPage(name: '/matchInfo', page: () => const MatchInfoPage()), - CustomGetPage(name: '/msgLikeDetail', page: () => const LikeDetailPage()), - CustomGetPage( - name: '/liveDmBlockPage', - page: () => const LiveDmBlockPage(), - ), - CustomGetPage(name: '/createVote', page: () => const CreateVotePage()), - CustomGetPage(name: '/musicDetail', page: () => const MusicDetailPage()), - CustomGetPage( - name: '/popularSeries', - page: () => const PopularSeriesPage(), - ), - CustomGetPage( - name: '/popularPrecious', - page: () => const PopularPreciousPage(), - ), - CustomGetPage(name: '/audio', page: () => const AudioPage()), - CustomGetPage(name: '/mainReply', page: () => const MainReplyPage()), - CustomGetPage(name: '/followed', page: () => const FollowedPage()), - CustomGetPage(name: '/sameFollowing', page: () => const FollowSamePage()), - CustomGetPage(name: '/download', page: () => const DownloadPage()), - CustomGetPage(name: '/dlna', page: () => const DLNAPage()), + GetPage(name: '/danmakuBlock', page: () => const DanmakuBlockPage()), + GetPage(name: '/sponsorBlock', page: () => const SponsorBlockPage()), + GetPage(name: '/createFav', page: () => const CreateFavPage()), + GetPage(name: '/editProfile', page: () => const EditProfilePage()), + GetPage(name: '/settingsSearch', page: () => const SettingsSearchPage()), + GetPage(name: '/webdavSetting', page: () => const WebDavSettingPage()), + GetPage(name: '/searchTrending', page: () => const SearchTrendingPage()), + GetPage(name: '/dynTopic', page: () => const DynTopicPage()), + GetPage(name: '/articleList', page: () => const ArticleListPage()), + GetPage(name: '/barSetting', page: () => const BarSetPage()), + GetPage(name: '/upowerRank', page: () => const UpowerRankPage()), + GetPage(name: '/spaceSetting', page: () => const SpaceSettingPage()), + GetPage(name: '/dynTopicRcmd', page: () => const DynTopicRcmdPage()), + GetPage(name: '/matchInfo', page: () => const MatchInfoPage()), + GetPage(name: '/msgLikeDetail', page: () => const LikeDetailPage()), + GetPage(name: '/liveDmBlockPage', page: () => const LiveDmBlockPage()), + GetPage(name: '/createVote', page: () => const CreateVotePage()), + GetPage(name: '/musicDetail', page: () => const MusicDetailPage()), + GetPage(name: '/popularSeries', page: () => const PopularSeriesPage()), + GetPage(name: '/popularPrecious', page: () => const PopularPreciousPage()), + GetPage(name: '/audio', page: () => const AudioPage()), + GetPage(name: '/mainReply', page: () => const MainReplyPage()), + GetPage(name: '/followed', page: () => const FollowedPage()), + GetPage(name: '/sameFollowing', page: () => const FollowSamePage()), + GetPage(name: '/download', page: () => const DownloadPage()), + GetPage(name: '/dlna', page: () => const DLNAPage()), ]; } - -class CustomGetPage extends GetPage { - CustomGetPage({ - required super.name, - required super.page, - super.popGesture = false, - super.fullscreenDialog = false, - super.showCupertinoParallax = false, - }); -} diff --git a/lib/services/download/download_service.dart b/lib/services/download/download_service.dart index 405e7e3d9..1b3c37062 100644 --- a/lib/services/download/download_service.dart +++ b/lib/services/download/download_service.dart @@ -5,6 +5,7 @@ import 'dart:io' show Directory, File; import 'package:PiliPlus/grpc/dm.dart'; import 'package:PiliPlus/http/download.dart'; import 'package:PiliPlus/http/init.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/video/video_quality.dart'; import 'package:PiliPlus/models_new/download/bili_download_entry_info.dart'; import 'package:PiliPlus/models_new/download/bili_download_media_file_info.dart'; @@ -322,8 +323,8 @@ class DownloadService extends GetxService { final danmaku = res.removeAt(0).data; for (final i in res) { - if (i.isSuccess) { - danmaku.elems.addAll(i.data.elems); + if (i case Success(:final response)) { + danmaku.elems.addAll(response.elems); } } res.clear(); diff --git a/lib/utils/image_utils.dart b/lib/utils/image_utils.dart index 8539583da..330d6dc12 100644 --- a/lib/utils/image_utils.dart +++ b/lib/utils/image_utils.dart @@ -305,21 +305,21 @@ abstract final class ImageUtils { required String fileName, String ext = 'png', }) async { - SaveResult? result; + SaveResult? res; fileName += '.$ext'; if (PlatformUtils.isMobile) { SmartDialog.showLoading(msg: '正在保存'); - result = await SaverGallery.saveImage( + res = await SaverGallery.saveImage( bytes, fileName: fileName, androidRelativePath: _androidRelativePath, skipIfExists: false, ); SmartDialog.dismiss(); - if (result.isSuccess) { + if (res.isSuccess) { SmartDialog.showToast(' 已保存 '); } else { - SmartDialog.showToast('保存失败,${result.errorMessage}'); + SmartDialog.showToast('保存失败,${res.errorMessage}'); } } else { SmartDialog.dismiss(); @@ -333,9 +333,9 @@ abstract final class ImageUtils { } await File(savePath).writeAsBytes(bytes); SmartDialog.showToast(' 已保存 '); - result = SaveResult(true, null); + res = SaveResult(true, null); } - return result; + return res; } static Future saveFileImg({ @@ -350,9 +350,9 @@ abstract final class ImageUtils { SmartDialog.showToast("文件不存在"); return; } - SaveResult? result; + SaveResult? res; if (PlatformUtils.isMobile) { - result = await SaverGallery.saveFile( + res = await SaverGallery.saveFile( filePath: filePath, fileName: fileName, androidRelativePath: _androidRelativePath, @@ -370,13 +370,13 @@ abstract final class ImageUtils { } await file.copy(savePath); if (del) file.tryDel(); - result = SaveResult(true, null); + res = SaveResult(true, null); } if (needToast) { - if (result.isSuccess) { + if (res.isSuccess) { SmartDialog.showToast(' 已保存 '); } else { - SmartDialog.showToast('保存失败,${result.errorMessage}'); + SmartDialog.showToast('保存失败,${res.errorMessage}'); } } } diff --git a/lib/utils/login_utils.dart b/lib/utils/login_utils.dart index 3809ddffb..1ccf8c581 100644 --- a/lib/utils/login_utils.dart +++ b/lib/utils/login_utils.dart @@ -1,9 +1,9 @@ import 'dart:async' show FutureOr; import 'dart:io' show Platform; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/main.dart'; -import 'package:PiliPlus/models/user/info.dart'; import 'package:PiliPlus/services/account_service.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; @@ -46,14 +46,13 @@ abstract final class LoginUtils { static Future onLoginMain() async { final account = Accounts.main; - final result = await UserHttp.userInfo(); - if (result.isSuccess) { + final res = await UserHttp.userInfo(); + if (res case Success(:final response)) { setWebCookie(account); RequestUtils.syncHistoryStatus(); - final UserInfoData data = result.data; - if (data.isLogin == true) { + if (response.isLogin == true) { final accountService = Get.find() - ..face.value = data.face!; + ..face.value = response.face!; if (accountService.isLogin.value) { accountService.isLogin.refresh(); @@ -62,15 +61,15 @@ abstract final class LoginUtils { } SmartDialog.showToast('main登录成功'); - if (data != Pref.userInfoCache) { - await GStorage.userInfo.put('userInfoCache', data); + if (response != Pref.userInfoCache) { + await GStorage.userInfo.put('userInfoCache', response); } } } else { // 获取用户信息失败 await Accounts.deleteAll({account}); SmartDialog.showNotify( - msg: '登录失败,请检查cookie是否正确,${result.toString()}', + msg: '登录失败,请检查cookie是否正确,${res.toString()}', notifyType: NotifyType.warning, ); } diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index ed23feab7..50b6ba472 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -4,13 +4,13 @@ import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/hero_dialog_ro import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart'; import 'package:PiliPlus/grpc/im.dart'; import 'package:PiliPlus/http/dynamics.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/common/image_preview_type.dart'; import 'package:PiliPlus/models/common/video/video_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart'; -import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart'; import 'package:PiliPlus/pages/common/common_intro_controller.dart'; import 'package:PiliPlus/pages/common/publish/publish_route.dart'; import 'package:PiliPlus/pages/contact/view.dart'; @@ -66,18 +66,22 @@ abstract final class PageUtils { List userList = []; - final shareListRes = await ImGrpc.shareList(size: 3); - if (shareListRes.isSuccess && shareListRes.data.sessionList.isNotEmpty) { - userList.addAll( - shareListRes.data.sessionList.map( - (item) => UserModel( - mid: item.talkerId.toInt(), - name: item.talkerUname, - avatar: item.talkerIcon, + final res = await ImGrpc.shareList(size: 5); + if (res case Success(:final response)) { + if (response.sessionList.isNotEmpty) { + userList.addAll( + response.sessionList.map( + (item) => UserModel( + mid: item.talkerId.toInt(), + name: item.talkerUname, + avatar: item.talkerIcon, + ), ), - ), - ); - } else if (context.mounted) { + ); + } + } + + if (userList.isEmpty && context.mounted) { final UserModel? userModel = await Navigator.of(context).push( GetPageRoute(page: () => const ContactPage()), ); @@ -291,9 +295,8 @@ abstract final class PageUtils { type: rid != null ? 2 : null, ); SmartDialog.dismiss(); - if (res.isSuccess) { - final data = res.data; - if (data.basic?.commentType == 12) { + if (res case Success(:final response)) { + if (response.basic?.commentType == 12) { toDupNamed( '/articlePage', parameters: { @@ -306,7 +309,7 @@ abstract final class PageUtils { toDupNamed( '/dynamicDetail', arguments: { - 'item': data, + 'item': response, }, off: off, ); @@ -808,11 +811,10 @@ abstract final class PageUtils { }) async { try { SmartDialog.showLoading(msg: '资源获取中'); - final result = await SearchHttp.pgcInfo(seasonId: seasonId, epId: epId); + final res = await SearchHttp.pgcInfo(seasonId: seasonId, epId: epId); SmartDialog.dismiss(); - if (result.isSuccess) { - PgcInfoModel data = result.data; - final episodes = data.episodes; + if (res case Success(:final response)) { + final episodes = response.episodes; final hasEpisode = episodes != null && episodes.isNotEmpty; EpisodeItem? episode; @@ -822,13 +824,13 @@ abstract final class PageUtils { videoType: VideoType.ugc, bvid: episode.bvid!, cid: episode.cid!, - seasonId: data.seasonId, + seasonId: response.seasonId, epId: episode.epId, cover: episode.cover, progress: progress == null ? null : int.tryParse(progress), extraArguments: { 'pgcApi': true, - 'pgcItem': data, + 'pgcItem': response, }, ); } @@ -843,7 +845,7 @@ abstract final class PageUtils { // find section if (episode == null) { - final sections = data.section; + final sections = response.section; if (sections != null && sections.isNotEmpty) { for (final section in sections) { final episodes = section.episodes; @@ -864,24 +866,24 @@ abstract final class PageUtils { if (hasEpisode) { episode ??= findEpisode( episodes, - epId: data.userStatus?.progress?.lastEpId, + epId: response.userStatus?.progress?.lastEpId, ); toVideoPage( videoType: VideoType.pgc, bvid: episode.bvid!, cid: episode.cid!, - seasonId: data.seasonId, + seasonId: response.seasonId, epId: episode.epId, - pgcType: data.type, + pgcType: response.type, cover: episode.cover, progress: progress == null ? null : int.tryParse(progress), extraArguments: { - 'pgcItem': data, + 'pgcItem': response, }, ); return; } else { - episode ??= data.section?.firstOrNull?.episodes?.firstOrNull; + episode ??= response.section?.firstOrNull?.episodes?.firstOrNull; if (episode != null) { viewSection(episode); return; @@ -890,7 +892,7 @@ abstract final class PageUtils { SmartDialog.showToast('资源加载失败'); } else { - result.toast(); + res.toast(); } } catch (e) { SmartDialog.dismiss(); @@ -908,9 +910,8 @@ abstract final class PageUtils { SmartDialog.showLoading(msg: '资源获取中'); final res = await SearchHttp.pugvInfo(seasonId: seasonId, epId: epId); SmartDialog.dismiss(); - if (res.isSuccess) { - PgcInfoModel data = res.data; - final episodes = data.episodes; + if (res case Success(:final response)) { + final episodes = response.episodes; if (episodes != null && episodes.isNotEmpty) { EpisodeItem? episode; if (aid != null) { @@ -918,18 +919,18 @@ abstract final class PageUtils { } episode ??= findEpisode( episodes, - epId: epId ?? data.userStatus?.progress?.lastEpId, + epId: epId ?? response.userStatus?.progress?.lastEpId, isPgc: false, ); toVideoPage( videoType: VideoType.pugv, aid: episode.aid!, cid: episode.cid!, - seasonId: data.seasonId, + seasonId: response.seasonId, epId: episode.id, cover: episode.cover, extraArguments: { - 'pgcItem': data, + 'pgcItem': response, }, ); } else { diff --git a/lib/utils/reply_utils.dart b/lib/utils/reply_utils.dart index f58473938..41a7413b8 100644 --- a/lib/utils/reply_utils.dart +++ b/lib/utils/reply_utils.dart @@ -6,7 +6,6 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart' import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/reply.dart'; import 'package:PiliPlus/models/common/reply/reply_sort_type.dart'; -import 'package:PiliPlus/models_new/reply/data.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; @@ -155,13 +154,12 @@ abstract final class ReplyUtils { page: 1, ); - if (res is Error) { - SmartDialog.showToast('获取评论主列表时发生错误:${res.errMsg}'); + if (res case Error(:final errMsg)) { + SmartDialog.showToast('获取评论主列表时发生错误:$errMsg'); return; - } else if (res.isSuccess) { - ReplyData replies = res.data; - int index = - replies.replies?.indexWhere((item) => item.rpid == id) ?? -1; + } else if (res case Success(:final response)) { + final index = + response.replies?.indexWhere((item) => item.rpid == id) ?? -1; if (index != -1) { // found showReplyCheckResult('无账号状态下找到了你的评论,评论正常!\n\n你的评论:$message'); diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index d7f119af5..8e00183bc 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -279,17 +279,16 @@ abstract final class RequestUtils { if (id != null) { await Future.delayed(const Duration(milliseconds: 450)); final res = await DynamicsHttp.dynamicDetail(id: id); - if (res.isSuccess) { + if (res case final Success e) { final ctr = Get.find(tag: 'all'); - if (ctr.loadingState.value.isSuccess) { - List? list = ctr.loadingState.value.data; - if (list != null) { - list.insert(0, res.data); + if (ctr.loadingState.value case Success(:final response)) { + if (response != null) { + response.insert(0, e.response); ctr.loadingState.refresh(); return; } } - ctr.loadingState.value = Success([res.data]); + ctr.loadingState.value = Success([e.response]); } } } catch (e) { @@ -393,8 +392,10 @@ abstract final class RequestUtils { required dynamic mid, }) { FavHttp.allFavFolders(mid).then((res) { - if (context.mounted && res.dataOrNull?.list?.isNotEmpty == true) { - final list = res.data.list!; + if (!context.mounted) return; + if (res case Success(:final response)) { + final list = response.list; + if (list == null || list.isEmpty) return; int? checkedId; showDialog( context: context, @@ -653,16 +654,15 @@ abstract final class RequestUtils { static Future showUserRealName(String mid) async { final res = await UserHttp.getUserRealName(mid); - if (res.isSuccess) { - final data = res.data; - final show = !data.name.isNullOrEmpty; + if (res case Success(:final response)) { + final show = !response.name.isNullOrEmpty; showDialog( context: Get.context!, builder: (context) => AlertDialog( title: SelectableText( - show ? data.name! : data.rejectPage?.title ?? '', + show ? response.name! : response.rejectPage?.title ?? '', ), - content: show ? null : Text(data.rejectPage?.text ?? ''), + content: show ? null : Text(response.rejectPage?.text ?? ''), actions: [ TextButton( onPressed: Get.back, diff --git a/pubspec.lock b/pubspec.lock index e777581ac..4fd673968 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -793,7 +793,7 @@ packages: description: path: "." ref: "version_4.7.2" - resolved-ref: "8b6dcbfb6217d4033204a15702de59588dd955ab" + resolved-ref: "58572238672734ba9351631a4fc81aed5dba3b16" url: "https://github.com/bggRGjQaUbCoE/getx.git" source: git version: "4.7.2"