refa: query data (#659)

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
dom
2025-04-10 21:43:01 +08:00
committed by GitHub
parent 99b19e7b03
commit e1b73f4766
128 changed files with 1493 additions and 1987 deletions

View File

@@ -3,7 +3,6 @@ import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/models/user/fav_detail.dart';
import 'package:PiliPlus/models/user/fav_folder.dart';
import 'package:PiliPlus/pages/common/multi_select_controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
@@ -11,7 +10,8 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:PiliPlus/http/video.dart';
class FavDetailController extends MultiSelectController {
class FavDetailController
extends MultiSelectController<FavDetailData, FavDetailItemData> {
Rx<FavFolderItemData> item = FavFolderItemData().obs;
int? mediaId;
late String heroTag;
@@ -35,40 +35,39 @@ class FavDetailController extends MultiSelectController {
}
@override
bool customHandleResponse(Success response) {
List<FavDetailItemData>? getDataList(FavDetailData response) {
return response.list;
}
@override
void checkIsEnd(int length) {
if (item.value.mediaCount != null && length >= item.value.mediaCount!) {
isEnd = true;
}
}
@override
bool customHandleResponse(bool isRefresh, Success<FavDetailData> response) {
FavDetailData data = response.response;
if (currentPage == 1) {
if (isRefresh) {
item.value = data.info ?? FavFolderItemData();
isOwner.value = data.info?.mid == mid;
}
if (data.list.isNullOrEmpty) {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
data.list ??= <FavDetailItemData>[];
data.list!.insertAll(
0,
(loadingState.value as Success).response,
);
}
if (isEnd.not && (data.list?.length ?? 0) >= (data.info?.mediaCount ?? 0)) {
isEnd = true;
}
loadingState.value = LoadingState.success(data.list);
return true;
return false;
}
onCancelFav(int id, int type) async {
onCancelFav(int index, int id, int type) async {
var result = await VideoHttp.delFav(
ids: ['$id:$type'],
delIds: mediaId.toString(),
);
if (result['status']) {
List dataList = (loadingState.value as Success).response;
dataList.removeWhere((item) => item.id == id);
List<FavDetailItemData> dataList =
(loadingState.value as Success).response;
item.value.mediaCount = item.value.mediaCount! - 1;
item.refresh();
loadingState.value = LoadingState.success(dataList);
dataList.removeAt(index);
loadingState.refresh();
SmartDialog.showToast('取消收藏');
} else {
SmartDialog.showToast(result['msg']);
@@ -76,7 +75,8 @@ class FavDetailController extends MultiSelectController {
}
@override
Future<LoadingState> customGetData() => UserHttp.userFavFolderDetail(
Future<LoadingState<FavDetailData>> customGetData() =>
UserHttp.userFavFolderDetail(
pn: currentPage,
ps: 20,
mediaId: mediaId!,
@@ -110,8 +110,9 @@ class FavDetailController extends MultiSelectController {
delIds: mediaId.toString(),
);
if (result['status']) {
List dataList = (loadingState.value as Success).response;
List remainList =
List<FavDetailItemData> dataList =
(loadingState.value as Success).response;
List<FavDetailItemData> remainList =
dataList.toSet().difference(list.toSet()).toList();
item.value.mediaCount = item.value.mediaCount! - list.length;
item.refresh();
@@ -137,8 +138,7 @@ class FavDetailController extends MultiSelectController {
void toViewPlayAll() {
if (loadingState.value is Success) {
List<FavDetailItemData> list = List<FavDetailItemData>.from(
(loadingState.value as Success).response);
List<FavDetailItemData> list = (loadingState.value as Success).response;
for (FavDetailItemData element in list) {
if (element.cid == null) {
continue;

View File

@@ -22,7 +22,7 @@ class _FavSortPageState extends State<FavSortPage> {
FavDetailController get _favDetailController => widget.favDetailController;
final GlobalKey _key = GlobalKey();
late List<FavDetailItemData> list = List<FavDetailItemData>.from(
late List<FavDetailItemData> sortList = List<FavDetailItemData>.from(
(_favDetailController.loadingState.value as Success).response);
List<String> sort = <String>[];
@@ -39,7 +39,7 @@ class _FavSortPageState extends State<FavSortPage> {
if (_favDetailController.loadingState.value is Success) {
List<FavDetailItemData> list =
(_favDetailController.loadingState.value as Success).response;
this.list.addAll(list.sublist(this.list.length));
this.sortList.addAll(list.sublist(this.sortList.length));
if (mounted) {
setState(() {});
}
@@ -83,7 +83,7 @@ class _FavSortPageState extends State<FavSortPage> {
if (res['status']) {
SmartDialog.showToast('排序完成');
_favDetailController.loadingState.value =
LoadingState.success(list);
LoadingState.success(sortList);
Get.back();
} else {
SmartDialog.showToast(res['msg']);
@@ -103,14 +103,14 @@ class _FavSortPageState extends State<FavSortPage> {
newIndex -= 1;
}
final oldItem = list[oldIndex];
final oldItem = sortList[oldIndex];
final newItem =
list.getOrNull(oldIndex > newIndex ? newIndex - 1 : newIndex);
sortList.getOrNull(oldIndex > newIndex ? newIndex - 1 : newIndex);
sort.add(
'${newItem == null ? '0:0' : '${newItem.id}:${newItem.type}'}:${oldItem.id}:${oldItem.type}');
final tabsItem = list.removeAt(oldIndex);
list.insert(newIndex, tabsItem);
final tabsItem = sortList.removeAt(oldIndex);
sortList.insert(newIndex, tabsItem);
setState(() {});
}
@@ -124,7 +124,7 @@ class _FavSortPageState extends State<FavSortPage> {
footer: SizedBox(
height: MediaQuery.of(context).padding.bottom + 80,
),
children: list
children: sortList
.map(
(item) => Stack(
key: Key(item.id.toString()),

View File

@@ -135,7 +135,8 @@ class _FavDetailPageState extends State<FavDetailPage> {
visualDensity:
VisualDensity(horizontal: -2, vertical: -2),
),
onPressed: () => Utils.onCopyOrMove(
onPressed: () =>
Utils.onCopyOrMove<FavDetailItemData>(
context: context,
isCopy: true,
ctr: _favDetailController,
@@ -155,7 +156,8 @@ class _FavDetailPageState extends State<FavDetailPage> {
visualDensity:
VisualDensity(horizontal: -2, vertical: -2),
),
onPressed: () => Utils.onCopyOrMove(
onPressed: () =>
Utils.onCopyOrMove<FavDetailItemData>(
context: context,
isCopy: false,
ctr: _favDetailController,
@@ -188,15 +190,18 @@ class _FavDetailPageState extends State<FavDetailPage> {
: [
IconButton(
tooltip: '搜索',
onPressed: () =>
Get.toNamed('/favSearch', arguments: {
'type': 0,
'mediaId': int.parse(mediaId),
'title': _favDetailController.item.value.title,
'count':
_favDetailController.item.value.mediaCount,
'searchType': SearchType.fav,
}),
onPressed: () => Get.toNamed(
'/favSearch',
arguments: {
'type': 0,
'mediaId': int.parse(mediaId),
'title': _favDetailController.item.value.title,
'count':
_favDetailController.item.value.mediaCount,
'searchType': SearchType.fav,
'isOwner': _favDetailController.isOwner.value,
},
),
icon: const Icon(Icons.search_outlined),
),
// IconButton(
@@ -416,7 +421,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
);
}
Widget _buildBody(LoadingState loadingState) {
Widget _buildBody(LoadingState<List<FavDetailItemData>?> loadingState) {
return switch (loadingState) {
Loading() => SliverGrid(
gridDelegate: SliverGridDelegateWithExtentAndRatio(
@@ -431,7 +436,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
childCount: 10,
),
),
Success() => (loadingState.response as List?)?.isNotEmpty == true
Success() => loadingState.response?.isNotEmpty == true
? SliverPadding(
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).padding.bottom + 85,
@@ -444,7 +449,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
),
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index == loadingState.response.length) {
if (index == loadingState.response!.length) {
_favDetailController.onLoadMore();
return Container(
height: 60,
@@ -458,25 +463,26 @@ class _FavDetailPageState extends State<FavDetailPage> {
),
);
}
FavDetailItemData element = loadingState.response[index];
FavDetailItemData item = loadingState.response![index];
return Stack(
children: [
Positioned.fill(
child: FavVideoCardH(
videoItem: element,
videoItem: item,
callFn: () => _favDetailController.onCancelFav(
element.id!,
element.type!,
index,
item.id!,
item.type!,
),
onViewFav: () {
Utils.toViewPage(
'bvid=${element.bvid}&cid=${element.cid}',
'bvid=${item.bvid}&cid=${item.cid}',
arguments: {
'videoItem': element,
'heroTag': Utils.makeHeroTag(element.bvid),
'videoItem': item,
'heroTag': Utils.makeHeroTag(item.bvid),
'sourceType': 'fav',
'mediaId': _favDetailController.item.value.id,
'oid': element.id,
'oid': item.id,
'favTitle':
_favDetailController.item.value.title,
'count': _favDetailController
@@ -513,10 +519,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
child: LayoutBuilder(
builder: (context, constraints) =>
AnimatedOpacity(
opacity:
loadingState.response[index].checked == true
? 1
: 0,
opacity: item.checked == true ? 1 : 0,
duration: const Duration(milliseconds: 200),
child: Container(
alignment: Alignment.center,
@@ -531,11 +534,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
width: 34,
height: 34,
child: AnimatedScale(
scale: loadingState
.response[index].checked ==
true
? 1
: 0,
scale: item.checked == true ? 1 : 0,
duration:
const Duration(milliseconds: 250),
curve: Curves.easeInOut,
@@ -571,7 +570,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
],
);
},
childCount: loadingState.response.length + 1,
childCount: loadingState.response!.length + 1,
),
),
)