mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
refa: query data (#659)
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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()),
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user