mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-04-26 05:16:01 +08:00
63
lib/pages/member_video_web/archive/controller.dart
Normal file
63
lib/pages/member_video_web/archive/controller.dart
Normal file
@@ -0,0 +1,63 @@
|
||||
import 'package:PiliPlus/http/loading_state.dart';
|
||||
import 'package:PiliPlus/http/member.dart';
|
||||
import 'package:PiliPlus/models/common/member/archive_order_type_web.dart';
|
||||
import 'package:PiliPlus/models_new/member/search_archive/data.dart';
|
||||
import 'package:PiliPlus/models_new/member/search_archive/slist.dart';
|
||||
import 'package:PiliPlus/models_new/member/search_archive/vlist.dart';
|
||||
import 'package:PiliPlus/pages/member_video_web/base/controller.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class MemberVideoWebCtr
|
||||
extends
|
||||
BaseVideoWebCtr<
|
||||
SearchArchiveData,
|
||||
VListItemModel,
|
||||
ArchiveOrderTypeWeb
|
||||
> {
|
||||
int? _totalCount;
|
||||
@override
|
||||
final Rx<ArchiveOrderTypeWeb> order = Rx(.pubdate);
|
||||
|
||||
int tid = 0;
|
||||
String? specialType;
|
||||
List<ListTag>? tags;
|
||||
|
||||
@override
|
||||
List<VListItemModel>? getDataList(SearchArchiveData response) {
|
||||
return response.list?.vlist;
|
||||
}
|
||||
|
||||
@override
|
||||
bool customHandleResponse(
|
||||
bool isRefresh,
|
||||
Success<SearchArchiveData> response,
|
||||
) {
|
||||
if (isRefresh) {
|
||||
final data = response.response;
|
||||
if (data.page?.count case final count?) {
|
||||
if (tid == 0 && specialType == null) {
|
||||
_totalCount = count;
|
||||
}
|
||||
this.count = count;
|
||||
totalPage = (count / ps).ceil();
|
||||
}
|
||||
final tags = data.list?.tags;
|
||||
if (tags?.isNotEmpty ?? false) {
|
||||
this.tags = tags!
|
||||
..insert(0, ListTag(tid: 0, name: '全部类型', count: _totalCount));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<LoadingState<SearchArchiveData>> customGetData() =>
|
||||
MemberHttp.searchArchive(
|
||||
mid: mid,
|
||||
ps: ps,
|
||||
pn: page,
|
||||
order: order.value,
|
||||
tid: tid,
|
||||
specialType: specialType,
|
||||
);
|
||||
}
|
||||
87
lib/pages/member_video_web/archive/view.dart
Normal file
87
lib/pages/member_video_web/archive/view.dart
Normal file
@@ -0,0 +1,87 @@
|
||||
import 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart';
|
||||
import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';
|
||||
import 'package:PiliPlus/models/common/member/archive_order_type_web.dart';
|
||||
import 'package:PiliPlus/models_new/member/search_archive/data.dart';
|
||||
import 'package:PiliPlus/models_new/member/search_archive/vlist.dart';
|
||||
import 'package:PiliPlus/pages/member_video_web/archive/controller.dart';
|
||||
import 'package:PiliPlus/pages/member_video_web/base/view.dart';
|
||||
import 'package:PiliPlus/pages/search/widgets/search_text.dart';
|
||||
import 'package:PiliPlus/utils/grid.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class MemberVideoWeb extends StatefulWidget {
|
||||
const MemberVideoWeb({super.key});
|
||||
|
||||
@override
|
||||
State<MemberVideoWeb> createState() => _MemberVideoWebState();
|
||||
|
||||
static Future<void>? toMemberVideoWeb({
|
||||
required Object mid,
|
||||
required String name,
|
||||
}) {
|
||||
return Get.toNamed(
|
||||
'/videoWeb',
|
||||
arguments: {
|
||||
'mid': mid,
|
||||
'name': name,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _MemberVideoWebState
|
||||
extends
|
||||
BaseVideoWebState<
|
||||
MemberVideoWeb,
|
||||
SearchArchiveData,
|
||||
VListItemModel,
|
||||
ArchiveOrderTypeWeb
|
||||
>
|
||||
with GridMixin {
|
||||
@override
|
||||
late final MemberVideoWebCtr controller;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
controller = Get.put(MemberVideoWebCtr(), tag: name);
|
||||
}
|
||||
|
||||
@override
|
||||
List<ArchiveOrderTypeWeb> get values => ArchiveOrderTypeWeb.values;
|
||||
|
||||
@override
|
||||
Widget? buildTags(ColorScheme colorScheme) {
|
||||
if (controller.tags case final tags?) {
|
||||
return SliverPinnedHeader(
|
||||
backgroundColor: colorScheme.surface,
|
||||
child: SelfSizedHorizontalList(
|
||||
itemCount: tags.length,
|
||||
padding: const .fromLTRB(10, 0, 10, 8),
|
||||
itemBuilder: (context, index) {
|
||||
final item = tags[index];
|
||||
final isCurr = controller.specialType != null
|
||||
? item.specialType == controller.specialType
|
||||
: item.tid == controller.tid;
|
||||
return SearchText(
|
||||
padding: const .symmetric(horizontal: 8, vertical: 4),
|
||||
text: '${item.name!} ${item.count}',
|
||||
bgColor: isCurr ? colorScheme.secondaryContainer : null,
|
||||
textColor: isCurr ? colorScheme.onSecondaryContainer : null,
|
||||
onTap: (_) {
|
||||
if (isCurr) return;
|
||||
controller
|
||||
..tid = item.tid ?? 0
|
||||
..specialType = item.specialType
|
||||
..onReload();
|
||||
},
|
||||
);
|
||||
},
|
||||
separatorBuilder: (_, _) => const SizedBox(width: 10),
|
||||
),
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user