opt: handle response

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-03-01 08:59:12 +08:00
parent 312ce6e639
commit 11398ca64b
25 changed files with 339 additions and 306 deletions

View File

@@ -29,10 +29,10 @@ class Constants {
static const urlPattern =
r'https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]';
static const goodsUrlPrefix = "https://gaoneng.bilibili.com/tetris";
static get goodsUrlPrefix => "https://gaoneng.bilibili.com/tetris";
// 超分辨率滤镜
static const List<String> mpvAnime4KShaders = [
// 超分辨率滤镜
static List<String> get mpvAnime4KShaders => [
'Anime4K_Clamp_Highlights.glsl',
'Anime4K_Restore_CNN_VL.glsl',
'Anime4K_Upscale_CNN_x2_VL.glsl',
@@ -42,7 +42,7 @@ class Constants {
];
// 超分辨率滤镜 (轻量)
static const List<String> mpvAnime4KShadersLite = [
static List<String> get mpvAnime4KShadersLite => [
'Anime4K_Clamp_Highlights.glsl',
'Anime4K_Restore_CNN_M.glsl',
'Anime4K_Restore_CNN_S.glsl',
@@ -53,7 +53,7 @@ class Constants {
];
//内容来自 https://passport.bilibili.com/web/generic/country/list
static const List<Map<String, dynamic>> internationalDialingPrefix = [
static List<Map<String, dynamic>> get internationalDialingPrefix => [
{"id": 1, "cname": "中国大陆", "country_id": "86"},
{"id": 5, "cname": "中国香港特别行政区", "country_id": "852"},
{"id": 2, "cname": "中国澳门特别行政区", "country_id": "853"},

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:dio/dio.dart';
import '../models/dynamics/result.dart';
@@ -10,7 +11,6 @@ class DynamicsHttp {
String? type,
String? offset,
int? mid,
required bool antiGoodsDyn,
}) async {
Map<String, dynamic> data = {
'type': type ?? 'all',
@@ -26,7 +26,7 @@ class DynamicsHttp {
if (res.data['code'] == 0) {
try {
DynamicsDataModel data = DynamicsDataModel.fromJson(res.data['data']);
if (antiGoodsDyn) {
if (GStorage.antiGoodsDyn) {
data.items?.removeWhere(
(item) =>
item.orig?.modules?.moduleDynamic?.additional?.type ==

View File

@@ -389,7 +389,6 @@ class MemberHttp {
static Future<LoadingState> memberDynamic({
String? offset,
int? mid,
required bool antiGoodsDyn,
}) async {
String dmImgStr = Utils.base64EncodeRandomString(16, 64);
String dmCoverImgStr = Utils.base64EncodeRandomString(32, 128);
@@ -410,7 +409,7 @@ class MemberHttp {
var res = await Request().get(Api.memberDynamic, queryParameters: params);
if (res.data['code'] == 0) {
DynamicsDataModel data = DynamicsDataModel.fromJson(res.data['data']);
if (antiGoodsDyn) {
if (GStorage.antiGoodsDyn) {
data.items?.removeWhere((item) =>
item.orig?.modules?.moduleDynamic?.additional?.type ==
'ADDITIONAL_TYPE_GOODS' ||

View File

@@ -180,9 +180,11 @@ class UserHttp {
});
}
List<HotVideoItemModel> list = [];
if (res.data['data']?['list'] != null) {
for (var i in res.data['data']['list']) {
list.add(HotVideoItemModel.fromJson(i));
}
}
return LoadingState.success({
'list': list,
'count': res.data['data']['count'],

View File

@@ -27,11 +27,9 @@ class AboutPage extends StatefulWidget {
class _AboutPageState extends State<AboutPage> {
final AboutController _aboutController = Get.put(AboutController());
static const String _sourceCodeUrl =
'https://github.com/bggRGjQaUbCoE/PiliPlus';
static const String _originSourceCodeUrl =
'https://github.com/guozhigq/pilipala';
static const String _upstreamUrl = 'https://github.com/orz12/PiliPalaX';
final String _sourceCodeUrl = 'https://github.com/bggRGjQaUbCoE/PiliPlus';
final String _originSourceCodeUrl = 'https://github.com/guozhigq/pilipala';
final String _upstreamUrl = 'https://github.com/orz12/PiliPalaX';
late int _pressCount = 0;

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/http/bangumi.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/bangumi/pgc_index/condition.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:get/get.dart' hide Condition;
class PgcIndexController extends CommonController {
@@ -55,13 +56,13 @@ class PgcIndexController extends CommonController {
response.response['has_next'] == 0) {
isEnd = true;
}
if (response.response['list'] == null ||
(response.response['list'] as List?)?.isEmpty == true) {
if (isEnd.not && (response.response['list'] as List?).isNullOrEmpty) {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
response.response['list']
?.insertAll(0, (loadingState.value as Success).response);
response.response['list'] ??= [];
response.response['list']!
.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(response.response['list']);
return true;

View File

@@ -1,7 +1,9 @@
import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/user/black.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
@@ -24,9 +26,9 @@ class _BlackListPageState extends State<BlackListPage> {
void dispose() {
List list = _blackListController.loadingState.value is Success
? (_blackListController.loadingState.value as Success).response
: <int>[];
: <BlackListItem>[];
GStorage.setBlackMidsList(
list.isNotEmpty ? list.map<int>((e) => e.mid!).toList() : <int>[]);
list.isNotEmpty ? list.map((e) => e.mid!).toList() : <int>[]);
super.dispose();
}
@@ -111,18 +113,20 @@ class BlackListController extends CommonController {
@override
bool customHandleResponse(Success response) {
total.value = response.response.total;
if (response.response.list.isEmpty) {
if ((response.response.list as List?).isNullOrEmpty) {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
response.response.list
?.insertAll(0, (loadingState.value as Success).response);
response.response.list ??= <BlackListItem>[];
response.response.list!
.insertAll(0, (loadingState.value as Success).response);
}
if (response.response.list.length >= total.value) {
if (isEnd.not && response.response.list.length >= total.value) {
isEnd = true;
}
loadingState.value = LoadingState.success(
response.response.list.isNotEmpty ? response.response.list : <int>[]);
loadingState.value = LoadingState.success(response.response.list.isNotEmpty
? response.response.list
: <BlackListItem>[]);
return true;
}
@@ -133,7 +137,7 @@ class BlackListController extends CommonController {
list.removeWhere((e) => e.mid == mid);
total.value = total.value - 1;
loadingState.value =
LoadingState.success(list.isNotEmpty ? list : <int>[]);
LoadingState.success(list.isNotEmpty ? list : <BlackListItem>[]);
SmartDialog.showToast(result['msg']);
}
}

View File

@@ -29,7 +29,9 @@ abstract class CommonController extends GetxController {
LoadingState response = await customGetData();
if (response is Success) {
if (!customHandleResponse(response)) {
isEnd = response.response.isEmpty;
if ((response.response as List?).isNullOrEmpty) {
isEnd = true;
}
List currentList = loadingState.value is Success
? (loadingState.value as Success).response
: [];

View File

@@ -116,7 +116,7 @@ abstract class ReplyController extends CommonController {
} else if (loadingState.value is Success) {
replies.insertAll(0, (loadingState.value as Success).response.replies);
}
if (replies.length >= count.value) {
if (isEnd.not && replies.length >= count.value) {
isEnd = true;
}
loadingState.value = LoadingState.success(response.response);

View File

@@ -1,8 +1,9 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/main/controller.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
@@ -33,23 +34,23 @@ class DynamicsTabController extends CommonController {
@override
bool customHandleResponse(Success response) {
offset = response.response.offset;
isEnd = response.response.items.isEmpty;
if ((response.response.items as List?).isNullOrEmpty) {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
response.response.items
response.response.items ??= <DynamicItemModel>[];
response.response.items!
.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(response.response.items);
return true;
}
late final antiGoodsDyn = GStorage.antiGoodsDyn;
@override
Future<LoadingState> customGetData() => DynamicsHttp.followDynamic(
type: dynamicsType == "up" ? "all" : dynamicsType,
offset: offset,
mid: dynamicsType == "up" ? mid : -1,
antiGoodsDyn: antiGoodsDyn,
);
Future onRemove(dynamic dynamicId) async {

View File

@@ -1,6 +1,8 @@
import 'package:PiliPlus/http/fan.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/fans/result.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:get/get.dart';
import 'package:PiliPlus/utils/storage.dart';
@@ -28,11 +30,12 @@ class FansController extends CommonController {
@override
bool customHandleResponse(Success response) {
if ((currentPage == 1 && response.response.total < ps) ||
response.response.list.isEmpty) {
(response.response.list as List?).isNullOrEmpty) {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
response.response.list
response.response.list ??= <FansItemModel>[];
response.response.list!
.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(response.response.list);

View File

@@ -1,6 +1,8 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/user/fav_folder.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/storage.dart';
class FavController extends CommonController {
@@ -23,11 +25,13 @@ class FavController extends CommonController {
@override
bool customHandleResponse(Success response) {
if (!response.response.hasMore || response.response.list.isEmpty) {
if (response.response.hasMore == false ||
(response.response.list as List?).isNullOrEmpty) {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
response.response.list
response.response.list ??= <FavFolderItemData>[];
response.response.list!
.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(response.response.list);

View File

@@ -45,12 +45,14 @@ class FavDetailController extends MultiSelectController {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
data.medias?.insertAll(
data.medias ??= <FavDetailItemData>[];
data.medias!.insertAll(
0,
List<FavDetailItemData>.from((loadingState.value as Success).response),
);
}
if ((data.medias?.length ?? 0) >= (data.info?.mediaCount ?? 0)) {
if (isEnd.not &&
(data.medias?.length ?? 0) >= (data.info?.mediaCount ?? 0)) {
isEnd = true;
}
loadingState.value = LoadingState.success(data.medias);

View File

@@ -46,10 +46,10 @@ class FavSearchController extends CommonController {
@override
bool customHandleResponse(Success response) {
List currentList = loadingState.value is Success
late List currentList = loadingState.value is Success
? (loadingState.value as Success).response
: [];
List dataList = searchType == SearchType.fav
List? dataList = searchType == SearchType.fav
? (currentPage == 1
? response.response.medias
: currentList + response.response.medias)
@@ -57,7 +57,7 @@ class FavSearchController extends CommonController {
? response.response.list
: currentList + response.response.list);
isEnd = searchType == SearchType.fav
? !response.response.hasMore
? response.response.hasMore == false
: response.response.list.isEmpty;
loadingState.value = LoadingState.success(dataList);
return true;

View File

@@ -35,7 +35,8 @@ class HistoryController extends MultiSelectController {
max = data.list?.lastOrNull?.history?.oid;
viewAt = data.list?.lastOrNull?.viewAt;
if (currentPage != 1 && loadingState.value is Success) {
data.list?.insertAll(
data.list ??= <HisListItem>[];
data.list!.insertAll(
0,
List<HisListItem>.from((loadingState.value as Success).response),
);

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/space_article/item.dart';
import 'package:PiliPlus/models/space_article/data.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/utils/extension.dart';
@@ -25,10 +26,10 @@ class MemberArticleCtr extends CommonController {
if (data.item.isNullOrEmpty) {
isEnd = true;
}
if (currentPage == 1) {
count = data.count ?? -1;
} else if (loadingState.value is Success) {
data.item?.insertAll(0, (loadingState.value as Success).response);
if (currentPage != 1 && loadingState.value is Success) {
data.item ??= <Item>[];
data.item!.insertAll(0, (loadingState.value as Success).response);
}
if ((data.item?.length ?? -1) >= count) {
isEnd = true;

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/space_archive/data.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart'
show ContributeType;
@@ -36,7 +37,8 @@ class MemberBangumiCtr extends CommonController {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
data.item?.insertAll(0, (loadingState.value as Success).response);
data.item ??= <Item>[];
data.item!.insertAll(0, (loadingState.value as Success).response);
}
if (data.item!.length >= count) {
isEnd = true;

View File

@@ -59,14 +59,18 @@ class MemberVideoCtr extends CommonController {
episodicButton.refresh();
next = data.next;
aid = data.item?.lastOrNull?.param;
isEnd =
type == ContributeType.video ? data.hasNext == false : data.next == 0;
if (currentPage == 0) {
if ((type == ContributeType.video
? data.hasNext == false
: data.next == 0) ||
data.item.isNullOrEmpty) {
isEnd = true;
}
count.value = type == ContributeType.season
? (data.item?.length ?? -1)
: (data.count ?? -1);
} else if (loadingState.value is Success) {
data.item?.insertAll(0, (loadingState.value as Success).response);
if (currentPage != 0 && loadingState.value is Success) {
data.item ??= <Item>[];
data.item!.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(data.item);
return true;

View File

@@ -4,14 +4,12 @@ import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
class MemberDynamicsController extends CommonController {
MemberDynamicsController(this.mid);
int mid;
String offset = '';
late final antiGoodsDyn = GStorage.antiGoodsDyn;
@override
void onInit() async {
@@ -37,8 +35,11 @@ class MemberDynamicsController extends CommonController {
bool customHandleResponse(Success response) {
DynamicsDataModel data = response.response;
offset = data.offset?.isNotEmpty == true ? data.offset! : '-1';
isEnd = !(data.hasMore ?? false);
if (data.hasMore == false || data.items.isNullOrEmpty) {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
data.items ??= <DynamicItemModel>[];
data.items?.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(data.items);
@@ -49,7 +50,6 @@ class MemberDynamicsController extends CommonController {
Future<LoadingState> customGetData() => MemberHttp.memberDynamic(
offset: offset,
mid: mid,
antiGoodsDyn: antiGoodsDyn,
);
Future onRemove(dynamicId) async {

View File

@@ -46,7 +46,7 @@ class SearchPanelController extends CommonController {
isEnd = response.response.list.isEmpty;
if (currentPage != 1 && loadingState.value is Success) {
response.response.list
?.insertAll(0, (loadingState.value as Success).response);
.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(response.response.list);
if (searchType == SearchType.video &&

View File

@@ -24,7 +24,7 @@ class SponsorBlockPage extends StatefulWidget {
}
class _SponsorBlockPageState extends State<SponsorBlockPage> {
static const _url = 'https://github.com/hanydd/BilibiliSponsorBlock';
final _url = 'https://github.com/hanydd/BilibiliSponsorBlock';
final _textController = TextEditingController();
late double _blockLimit;
late List<Pair<SegmentType, SkipType>> _blockSettings;

View File

@@ -2086,6 +2086,9 @@ List<SettingsModel> get extraSettings => [
),
setKey: SettingBoxKey.antiGoodsDyn,
defaultVal: false,
onChanged: (value) {
GStorage.antiGoodsDyn = value;
},
),
SettingsModel(
settingsType: SettingsType.sw1tch,

View File

@@ -1,9 +1,11 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/space_archive/data.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart'
show ContributeType;
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:get/get.dart';
@@ -55,11 +57,13 @@ class HorizontalMemberPageController extends CommonController {
Data data = response.response;
next = data.next;
aid = data.item?.lastOrNull?.param;
isEnd = data.hasNext == false;
if (currentPage == 0) {
if (data.hasNext == false || data.item.isNullOrEmpty) {
isEnd = true;
}
count.value = data.count ?? -1;
} else if (loadingState.value is Success) {
data.item?.insertAll(0, (loadingState.value as Success).response);
if (currentPage != 0 && loadingState.value is Success) {
data.item ??= <Item>[];
data.item!.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(data.item);
return true;

View File

@@ -2378,9 +2378,11 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
} else {
videoDetailController.childKey.currentState?.showBottomSheet(
backgroundColor: Colors.transparent,
(context) => ViewPointsPage(
(context) => GStorage.collapsibleVideoPage
? ViewPointsPage(
child: listSheetContent(),
),
)
: listSheetContent(),
);
}
}

View File

@@ -379,7 +379,7 @@ class GStorage {
static bool get isPureBlackTheme =>
GStorage.setting.get(SettingBoxKey.isPureBlackTheme, defaultValue: false);
static bool get antiGoodsDyn =>
static bool antiGoodsDyn =
GStorage.setting.get(SettingBoxKey.antiGoodsDyn, defaultValue: false);
static bool get antiGoodsReply =>