diff --git a/lib/grpc/grpc_repo.dart b/lib/grpc/grpc_repo.dart index d9c02232f..fed740fca 100644 --- a/lib/grpc/grpc_repo.dart +++ b/lib/grpc/grpc_repo.dart @@ -45,9 +45,6 @@ class GrpcUrl { } class GrpcRepo { - static const gzipEncoder = GZipEncoder(); - static const gzipDecoder = GZipDecoder(); - static final String? _accessKey = Accounts.main.accessKey; static const _build = 1462100; static const _biliChannel = 'bili'; @@ -124,21 +121,19 @@ class GrpcRepo { static final unprintableRegExp = RegExp(r"[^\u4e00-\u9fa5,。;!?UP]"); static Uint8List compressProtobuf(Uint8List proto) { - proto = gzipEncoder.encodeBytes(proto, level: 0); - var byteLength = ByteData(4); - byteLength.setInt32(0, proto.length, Endian.big); - var compressed = Uint8List(5 + proto.length); - compressed[0] = 1; - compressed.setRange(1, 5, byteLength.buffer.asUint8List()); - compressed.setAll(5, proto); - return compressed; + proto = const GZipEncoder().encodeBytes(proto); + var byteLength = ByteData(4)..setInt32(0, proto.length, Endian.big); + return Uint8List(5 + proto.length) + ..[0] = 1 + ..setRange(1, 5, byteLength.buffer.asUint8List()) + ..setAll(5, proto); } static Uint8List decompressProtobuf(Uint8List data) { var length = ByteData.sublistView(data, 1, 5).getInt32(0, Endian.big); if (data[0] == 1) { - return gzipDecoder.decodeBytes(data.sublist(5, length + 5)); + return const GZipDecoder().decodeBytes(data.sublist(5, length + 5)); } else { return data.sublist(5, length + 5); } diff --git a/lib/http/loading_state.dart b/lib/http/loading_state.dart index 82befbe67..c19e92e89 100644 --- a/lib/http/loading_state.dart +++ b/lib/http/loading_state.dart @@ -14,6 +14,11 @@ sealed class LoadingState { Error() => throw this, Loading() => throw Exception('ApiException: loading'), }; + + T? get dataOrNull => switch (this) { + Success(response: final res) => res, + _ => null, + }; } class Loading extends LoadingState { diff --git a/lib/pages/bangumi/controller.dart b/lib/pages/bangumi/controller.dart index 5c04d3877..d5e785460 100644 --- a/lib/pages/bangumi/controller.dart +++ b/lib/pages/bangumi/controller.dart @@ -102,9 +102,7 @@ class BangumiController extends CommonListController< followState.value = LoadingState.success(list); followController?.animToTop(); } else if (followState.value is Success) { - List currentList = - (followState.value as Success).response; - currentList.addAll(list!); + final currentList = followState.value.data!..addAll(list!); if (currentList.length >= followCount.value) { followEnd = true; } diff --git a/lib/pages/blacklist/controller.dart b/lib/pages/blacklist/controller.dart index fb4fc185e..896b44ce4 100644 --- a/lib/pages/blacklist/controller.dart +++ b/lib/pages/blacklist/controller.dart @@ -45,8 +45,7 @@ class BlackListController onConfirm: () async { var result = await VideoHttp.relationMod(mid: mid, act: 6, reSrc: 11); if (result['status']) { - List list = (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); total.value -= 1; loadingState.refresh(); SmartDialog.showToast('操作成功'); diff --git a/lib/pages/common/common_controller.dart b/lib/pages/common/common_controller.dart index 4da358725..140b1c778 100644 --- a/lib/pages/common/common_controller.dart +++ b/lib/pages/common/common_controller.dart @@ -64,8 +64,7 @@ abstract class CommonController extends GetxController checkIsEnd(dataList.length); loadingState.value = LoadingState?>.success(dataList); } else if (loadingState.value is Success) { - List list = (loadingState.value as Success).response; - list.addAll(dataList); + final list = (loadingState.value.data! as List)..addAll(dataList); checkIsEnd(list.length); loadingState.refresh(); } diff --git a/lib/pages/dynamics_tab/controller.dart b/lib/pages/dynamics_tab/controller.dart index fefc0f6d6..8bb2e99bc 100644 --- a/lib/pages/dynamics_tab/controller.dart +++ b/lib/pages/dynamics_tab/controller.dart @@ -54,8 +54,7 @@ class DynamicsTabController Future onRemove(dynamic dynamicId) async { var res = await MsgHttp.removeDynamic(dynIdStr: dynamicId); if (res['status']) { - List list = (loadingState.value as Success).response; - list.removeWhere((item) => item.idStr == dynamicId); + loadingState.value.data!.removeWhere((item) => item.idStr == dynamicId); loadingState.refresh(); SmartDialog.showToast('删除成功'); } else { diff --git a/lib/pages/fan/controller.dart b/lib/pages/fan/controller.dart index 54e2aa764..e0c11f012 100644 --- a/lib/pages/fan/controller.dart +++ b/lib/pages/fan/controller.dart @@ -38,8 +38,7 @@ class FansController reSrc: 11, ); if (res['status']) { - List list = (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); SmartDialog.showToast('移除成功'); } else { diff --git a/lib/pages/fav/article/controller.dart b/lib/pages/fav/article/controller.dart index 54608d6f2..f96df9d50 100644 --- a/lib/pages/fav/article/controller.dart +++ b/lib/pages/fav/article/controller.dart @@ -30,8 +30,7 @@ class FavArticleController extends CommonListController { Future onRemove(index, id) async { final res = await UserHttp.communityAction(opusId: id, action: 4); if (res['status']) { - List list = (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); SmartDialog.showToast('已取消收藏'); } else { diff --git a/lib/pages/fav/pgc/controller.dart b/lib/pages/fav/pgc/controller.dart index 5d5552345..24cd8a418 100644 --- a/lib/pages/fav/pgc/controller.dart +++ b/lib/pages/fav/pgc/controller.dart @@ -57,9 +57,7 @@ class FavPgcController Future bangumiDel(index, seasonId) async { var result = await VideoHttp.bangumiDel(seasonId: seasonId); if (result['status']) { - List list = - (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); } SmartDialog.showToast(result['msg']); @@ -82,9 +80,8 @@ class FavPgcController try { final ctr = Get.find(tag: '$type$followStatus'); if (ctr.loadingState.value is Success) { - List list = - (ctr.loadingState.value as Success).response; - list.insertAll(0, updateList.map((item) => item..checked = null)); + ctr.loadingState.value.data! + .insertAll(0, updateList.map((item) => item..checked = null)); ctr.loadingState.refresh(); ctr.allSelected.value = false; } @@ -108,9 +105,7 @@ class FavPgcController try { final ctr = Get.find(tag: '$type$followStatus'); if (ctr.loadingState.value is Success) { - List list = - (ctr.loadingState.value as Success).response; - list.insert(0, item); + ctr.loadingState.value.data!.insert(0, item); ctr.loadingState.refresh(); ctr.allSelected.value = false; } diff --git a/lib/pages/fav/video/view.dart b/lib/pages/fav/video/view.dart index 96307926b..ebc817874 100644 --- a/lib/pages/fav/video/view.dart +++ b/lib/pages/fav/video/view.dart @@ -85,10 +85,7 @@ class _FavVideoPageState extends State }, ); if (res == true) { - List list = - (_favController.loadingState.value as Success) - .response; - list.removeAt(index); + _favController.loadingState.value.data!.removeAt(index); _favController.loadingState.refresh(); } }, diff --git a/lib/pages/fav_search/controller.dart b/lib/pages/fav_search/controller.dart index 6e9f11bcd..09281f194 100644 --- a/lib/pages/fav_search/controller.dart +++ b/lib/pages/fav_search/controller.dart @@ -45,9 +45,7 @@ class FavSearchController type: type, ); if (result['status']) { - List dataList = - (loadingState.value as Success).response; - dataList.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); SmartDialog.showToast('取消收藏'); } diff --git a/lib/pages/history_search/controller.dart b/lib/pages/history_search/controller.dart index d7068bc0d..8af46451d 100644 --- a/lib/pages/history_search/controller.dart +++ b/lib/pages/history_search/controller.dart @@ -27,8 +27,7 @@ class HistorySearchController var res = await UserHttp.delHistory([resKid]); if (res['status']) { - List historyList = (loadingState.value as Success).response; - historyList.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); SmartDialog.showToast(res['msg']); } diff --git a/lib/pages/later/controller.dart b/lib/pages/later/controller.dart index ed1689d92..a52969c4d 100644 --- a/lib/pages/later/controller.dart +++ b/lib/pages/later/controller.dart @@ -105,9 +105,7 @@ class LaterController extends MultiSelectController { Get.back(); var res = await UserHttp.toViewDel(aids: [aid]); if (res['status']) { - List list = - (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); baseCtr.counts[laterViewType] = baseCtr.counts[laterViewType]! - 1; loadingState.refresh(); diff --git a/lib/pages/later_search/controller.dart b/lib/pages/later_search/controller.dart index a5c4590a3..0b8f8acd6 100644 --- a/lib/pages/later_search/controller.dart +++ b/lib/pages/later_search/controller.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models/model_hot_video_item.dart'; import 'package:PiliPlus/pages/common/common_search_controller.dart'; -import 'package:PiliPlus/http/user.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -25,8 +25,7 @@ class LaterSearchController Future toViewDel(BuildContext context, int index, aid) async { var res = await UserHttp.toViewDel(aids: [aid]); if (res['status']) { - List list = (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); } SmartDialog.showToast(res['msg']); diff --git a/lib/pages/live/controller.dart b/lib/pages/live/controller.dart index 0b6a8698c..e82a3f0f8 100644 --- a/lib/pages/live/controller.dart +++ b/lib/pages/live/controller.dart @@ -59,7 +59,8 @@ class LiveController } late RxBool isLogin = Accounts.main.isLogin.obs; - late Rx followListState = LoadingState.loading().obs; + late Rx?>> followListState = + Rx(LoadingState.loading()); late int followPage = 1; late bool followEnd = false; late RxInt liveCount = 0.obs; @@ -93,9 +94,8 @@ class LiveController } followListState.value = LoadingState.success(dataList); } else if (followListState.value is Success) { - List list = - (followListState.value as Success).response; - list.addAll(dataList!); + List list = followListState.value.data! + ..addAll(dataList!); if (list.length >= liveCount.value) { followEnd = true; } diff --git a/lib/pages/member_dynamics/controller.dart b/lib/pages/member_dynamics/controller.dart index adc9612cd..a408dc3ab 100644 --- a/lib/pages/member_dynamics/controller.dart +++ b/lib/pages/member_dynamics/controller.dart @@ -59,8 +59,7 @@ class MemberDynamicsController Future onRemove(dynamicId) async { var res = await MsgHttp.removeDynamic(dynIdStr: dynamicId); if (res['status']) { - List list = (loadingState.value as Success).response; - list.removeWhere((item) => item.idStr == dynamicId); + loadingState.value.data!.removeWhere((item) => item.idStr == dynamicId); loadingState.refresh(); SmartDialog.showToast('删除成功'); } else { diff --git a/lib/pages/member_search/controller.dart b/lib/pages/member_search/controller.dart index 53d36d897..dbda3581d 100644 --- a/lib/pages/member_search/controller.dart +++ b/lib/pages/member_search/controller.dart @@ -105,9 +105,8 @@ class MemberSearchController extends GetxController } dynamicState.value = LoadingState.success(items); } else if (dynamicState.value is Success) { - List currentList = - (dynamicState.value as Success).response; - currentList.addAll(items!); + List currentList = dynamicState.value.data! + ..addAll(items!); if (currentList.length >= dynamicCount.value) { isEndDynamic = true; } @@ -147,9 +146,8 @@ class MemberSearchController extends GetxController } archiveState.value = LoadingState.success(vlist); } else if (archiveState.value is Success) { - List currentList = - (archiveState.value as Success).response; - currentList.addAll(vlist!); + List currentList = archiveState.value.data! + ..addAll(vlist!); if (currentList.length >= archiveCount.value) { isEndArchive = true; } diff --git a/lib/pages/msg_feed_top/at_me/controller.dart b/lib/pages/msg_feed_top/at_me/controller.dart index df1cdb5ab..2e574a315 100644 --- a/lib/pages/msg_feed_top/at_me/controller.dart +++ b/lib/pages/msg_feed_top/at_me/controller.dart @@ -45,8 +45,7 @@ class AtMeController extends CommonListController { try { var res = await MsgHttp.delMsgfeed(2, id); if (res['status']) { - List list = (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); SmartDialog.showToast('删除成功'); } else { diff --git a/lib/pages/msg_feed_top/reply_me/controller.dart b/lib/pages/msg_feed_top/reply_me/controller.dart index 332dd62cc..c6f1d86d8 100644 --- a/lib/pages/msg_feed_top/reply_me/controller.dart +++ b/lib/pages/msg_feed_top/reply_me/controller.dart @@ -46,8 +46,7 @@ class ReplyMeController try { var res = await MsgHttp.delMsgfeed(1, id); if (res['status']) { - List list = (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); SmartDialog.showToast('删除成功'); } else { diff --git a/lib/pages/msg_feed_top/sys_msg/controller.dart b/lib/pages/msg_feed_top/sys_msg/controller.dart index a3d6561d8..b38622d86 100644 --- a/lib/pages/msg_feed_top/sys_msg/controller.dart +++ b/lib/pages/msg_feed_top/sys_msg/controller.dart @@ -43,8 +43,7 @@ class SysMsgController try { var res = await MsgHttp.delSysMsg(id); if (res['status']) { - List list = (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); SmartDialog.showToast('删除成功'); } else { diff --git a/lib/pages/subscription/controller.dart b/lib/pages/subscription/controller.dart index 67174aadc..6fe57396e 100644 --- a/lib/pages/subscription/controller.dart +++ b/lib/pages/subscription/controller.dart @@ -49,9 +49,7 @@ class SubController var res = await UserHttp.cancelSub( id: subFolderItem.id!, type: subFolderItem.type!); if (res['status']) { - List list = - (loadingState.value as Success).response; - list.remove(subFolderItem); + loadingState.value.data!.remove(subFolderItem); loadingState.refresh(); SmartDialog.showToast('取消订阅成功'); } else { diff --git a/lib/pages/video/reply_reply/view.dart b/lib/pages/video/reply_reply/view.dart index ebbede3f7..4c34a63ae 100644 --- a/lib/pages/video/reply_reply/view.dart +++ b/lib/pages/video/reply_reply/view.dart @@ -360,12 +360,8 @@ class _VideoReplyReplyPanelState if (res != null) { _savedReplies[key] = null; ReplyInfo replyInfo = RequestUtils.replyCast(res); - List list = - _videoReplyReplyController.loadingState.value is Success - ? (_videoReplyReplyController.loadingState.value as Success) - .response - : []; - list.insert(index + 1, replyInfo); + _videoReplyReplyController.loadingState.value.dataOrNull + ?.insert(index + 1, replyInfo); _videoReplyReplyController.count.value += 1; _videoReplyReplyController.loadingState.refresh(); if (_videoReplyReplyController.enableCommAntifraud && mounted) { @@ -462,9 +458,7 @@ class _VideoReplyReplyPanelState _onReply(replyItem, index); }, onDelete: (subIndex) { - List list = - (_videoReplyReplyController.loadingState.value as Success).response; - list.removeAt(index); + _videoReplyReplyController.loadingState.value.data!.removeAt(index); _videoReplyReplyController.count.value -= 1; _videoReplyReplyController.loadingState.refresh(); }, diff --git a/lib/pages/whisper/controller.dart b/lib/pages/whisper/controller.dart index f07b4b048..873167d1c 100644 --- a/lib/pages/whisper/controller.dart +++ b/lib/pages/whisper/controller.dart @@ -85,8 +85,7 @@ class WhisperController if (isRefresh) { loadingState.value = LoadingState?>.success(dataList); } else if (loadingState.value is Success) { - List list = (loadingState.value as Success).response; - list.addAll(dataList); + loadingState.value.data!.addAll(dataList); loadingState.refresh(); } }); @@ -103,8 +102,7 @@ class WhisperController Future onRemove(int index, int? talkerId) async { var res = await MsgHttp.removeMsg(talkerId); if (res['status']) { - List list = (loadingState.value as Success).response; - list.removeAt(index); + loadingState.value.data!.removeAt(index); loadingState.refresh(); SmartDialog.showToast('删除成功'); } else { diff --git a/lib/services/audio_handler.dart b/lib/services/audio_handler.dart index 93c6c9f35..014b91819 100644 --- a/lib/services/audio_handler.dart +++ b/lib/services/audio_handler.dart @@ -209,7 +209,9 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { void onPositionChange(Duration position) { if (!enableBackgroundPlay || _item.isEmpty || - PlPlayerController.instanceExists().not) return; + PlPlayerController.instanceExists().not) { + return; + } playbackState.add(playbackState.value.copyWith( updatePosition: position, diff --git a/lib/utils/extension.dart b/lib/utils/extension.dart index 64bede94b..2431b7120 100644 --- a/lib/utils/extension.dart +++ b/lib/utils/extension.dart @@ -108,10 +108,9 @@ extension BuildContextExt on BuildContext { extension Unique on List { List unique([Id Function(E element)? id, bool inplace = true]) { - final ids = {}; - var list = inplace ? this : List.from(this); - list.retainWhere((x) => ids.add(id != null ? id(x) : x as Id)); - return list; + final ids = {}; + return (inplace ? this : List.from(this)) + ..retainWhere((x) => ids.add(id != null ? id(x) : x as Id)); } }