From 0ece0bd7faca531ca48b805401f5b563bfcaa0b7 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Fri, 10 Jan 2025 10:33:58 +0800 Subject: [PATCH] feat: home: cinema Signed-off-by: bggRGjQaUbCoE --- lib/http/bangumi.dart | 11 +++++--- lib/http/search.dart | 1 + lib/models/common/tab_type.dart | 18 ++++++++++--- lib/pages/bangumi/controller.dart | 8 +++++- .../bangumi/introduction/controller.dart | 2 ++ lib/pages/bangumi/introduction/view.dart | 8 +++--- lib/pages/bangumi/view.dart | 19 +++++++++++--- lib/pages/home/controller.dart | 26 ++++++++++++++----- lib/pages/setting/pages/home_tabbar_set.dart | 12 ++++----- 9 files changed, 76 insertions(+), 29 deletions(-) diff --git a/lib/http/bangumi.dart b/lib/http/bangumi.dart index bf1caf56d..cdfedbe5d 100644 --- a/lib/http/bangumi.dart +++ b/lib/http/bangumi.dart @@ -4,9 +4,14 @@ import '../models/bangumi/list.dart'; import 'index.dart'; class BangumiHttp { - static Future bangumiList({int? page}) async { - var res = - await Request().get(Api.bangumiList, queryParameters: {'page': page}); + static Future bangumiList({ + int? page, + int? indexType, + }) async { + var res = await Request().get(Api.bangumiList, queryParameters: { + 'page': page, + if (indexType != null) 'index_type': indexType, + }); if (res.data['code'] == 0) { BangumiListDataModel data = BangumiListDataModel.fromJson(res.data['data']); diff --git a/lib/http/search.dart b/lib/http/search.dart index 9ff98aaf8..49b784e3e 100644 --- a/lib/http/search.dart +++ b/lib/http/search.dart @@ -182,6 +182,7 @@ class SearchHttp { } final dynamic res = await Request() .get(Api.bangumiInfo, queryParameters: {...data}); + if (res.data['code'] == 0) { return { 'status': true, diff --git a/lib/models/common/tab_type.dart b/lib/models/common/tab_type.dart index 1df27f07b..5c131eee2 100644 --- a/lib/models/common/tab_type.dart +++ b/lib/models/common/tab_type.dart @@ -5,12 +5,12 @@ import 'package:PiliPlus/pages/bangumi/index.dart'; import 'package:PiliPlus/pages/hot/index.dart'; import 'package:PiliPlus/pages/live/index.dart'; import 'package:PiliPlus/pages/rcmd/index.dart'; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; -enum TabType { live, rcmd, hot, rank, bangumi } +enum TabType { live, rcmd, hot, rank, bangumi, cinema } extension TabTypeDesc on TabType { - String get description => ['直播', '推荐', '热门', '分区', '番剧'][index]; - String get id => ['live', 'rcmd', 'hot', 'rank', 'bangumi'][index]; + String get description => ['直播', '推荐', '热门', '分区', '番剧', '影视'][index]; } List get tabsConfig => [ @@ -62,6 +62,16 @@ List get tabsConfig => [ 'label': '番剧', 'type': TabType.bangumi, 'ctr': Get.find, - 'page': const BangumiPage(), + 'page': const BangumiPage(tabType: TabType.bangumi), + }, + { + 'icon': Icon( + MdiIcons.theater, + size: 15, + ), + 'label': '影视', + 'type': TabType.cinema, + 'ctr': Get.find, + 'page': const BangumiPage(tabType: TabType.cinema), }, ]; diff --git a/lib/pages/bangumi/controller.dart b/lib/pages/bangumi/controller.dart index baac445d7..0d9e2488b 100644 --- a/lib/pages/bangumi/controller.dart +++ b/lib/pages/bangumi/controller.dart @@ -1,5 +1,6 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/bangumi/list.dart'; +import 'package:PiliPlus/models/common/tab_type.dart'; import 'package:PiliPlus/pages/common/common_controller.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:flutter/material.dart'; @@ -8,6 +9,9 @@ import 'package:PiliPlus/http/bangumi.dart'; import 'package:PiliPlus/utils/storage.dart'; class BangumiController extends CommonController { + BangumiController({required this.tabType}); + final TabType tabType; + bool isLoadingMore = true; RxBool isLogin = false.obs; int? mid; @@ -33,6 +37,7 @@ class BangumiController extends CommonController { followPage = 1; followEnd = false; } + queryBangumiFollow(); return super.onRefresh(); } @@ -51,7 +56,7 @@ class BangumiController extends CommonController { followLoading = true; dynamic res = await BangumiHttp.bangumiFollow( mid: mid, - type: 1, + type: tabType == TabType.bangumi ? 1 : 2, pn: followPage, ); if (res is Success) { @@ -75,6 +80,7 @@ class BangumiController extends CommonController { @override Future customGetData() => BangumiHttp.bangumiList( page: currentPage, + indexType: tabType == TabType.cinema ? 102 : null, // TODO: sort ); @override diff --git a/lib/pages/bangumi/introduction/controller.dart b/lib/pages/bangumi/introduction/controller.dart index b4beb07a9..33423ebc9 100644 --- a/lib/pages/bangumi/introduction/controller.dart +++ b/lib/pages/bangumi/introduction/controller.dart @@ -34,6 +34,8 @@ class BangumiIntroController extends CommonController { ? int.tryParse(Get.parameters['epId']!) : null; + late dynamic type = Get.parameters['type'] == '1' ? '追番' : '追剧'; + // 是否预渲染 骨架屏 bool preRender = false; diff --git a/lib/pages/bangumi/introduction/view.dart b/lib/pages/bangumi/introduction/view.dart index 38ec678d9..522a42ffb 100644 --- a/lib/pages/bangumi/introduction/view.dart +++ b/lib/pages/bangumi/introduction/view.dart @@ -343,8 +343,8 @@ class _BangumiInfoState extends State child: Text( bangumiIntroController .isFollowed.value - ? '已追番' - : '追番', + ? '已${bangumiIntroController.type}' + : '${bangumiIntroController.type}', ), ), ), @@ -632,10 +632,10 @@ class _BangumiInfoState extends State _followDialogItem(1, '想看'), ListTile( dense: true, - title: const Padding( + title: Padding( padding: EdgeInsets.only(left: 10), child: Text( - '取消追番', + '取消${bangumiIntroController.type}', style: TextStyle(fontSize: 14), ), ), diff --git a/lib/pages/bangumi/view.dart b/lib/pages/bangumi/view.dart index f5e762396..ff4c046f7 100644 --- a/lib/pages/bangumi/view.dart +++ b/lib/pages/bangumi/view.dart @@ -3,6 +3,7 @@ import 'dart:async'; 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/common/tab_type.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; @@ -16,7 +17,12 @@ import 'controller.dart'; import 'widgets/bangumi_card_v.dart'; class BangumiPage extends StatefulWidget { - const BangumiPage({super.key}); + const BangumiPage({ + super.key, + required this.tabType, + }); + + final TabType tabType; @override State createState() => _BangumiPageState(); @@ -24,7 +30,10 @@ class BangumiPage extends StatefulWidget { class _BangumiPageState extends State with AutomaticKeepAliveClientMixin { - final BangumiController _bangumiController = Get.put(BangumiController()); + late final BangumiController _bangumiController = Get.put( + BangumiController(tabType: widget.tabType), + tag: widget.tabType.name, + ); @override bool get wantKeepAlive => true; @@ -84,7 +93,7 @@ class _BangumiPageState extends State children: [ Obx( () => Text( - '最近追番${_bangumiController.followCount.value == -1 ? '' : ' ${_bangumiController.followCount.value}'}', + '最近${widget.tabType == TabType.bangumi ? '追番' : '追剧'}${_bangumiController.followCount.value == -1 ? '' : ' ${_bangumiController.followCount.value}'}', style: Theme.of(context).textTheme.titleMedium, ), ), @@ -210,7 +219,9 @@ class _BangumiPageState extends State Loading() => loadingWidget, Success() => (loadingState.response as List?)?.isNotEmpty == true ? _buildFollowList(loadingState) - : const Center(child: Text('还没有追番')), + : Center( + child: Text( + '还没有${widget.tabType == TabType.bangumi ? '追番' : '追剧'}')), Error() => Container( padding: const EdgeInsets.symmetric(horizontal: 16), alignment: Alignment.center, diff --git a/lib/pages/home/controller.dart b/lib/pages/home/controller.dart index 6b60f00b2..079404c46 100644 --- a/lib/pages/home/controller.dart +++ b/lib/pages/home/controller.dart @@ -52,7 +52,13 @@ class HomeController extends GetxController with GetTickerProviderStateMixin { try { int index = tabController.index; var ctr = tabsCtrList[index]; - ctr().onRefresh(); + ctr( + tag: tabs[index]['type'] == TabType.bangumi + ? TabType.bangumi.name + : tabs[index]['type'] == TabType.cinema + ? TabType.cinema.name + : null) + .onRefresh(); } catch (_) {} } @@ -60,7 +66,13 @@ class HomeController extends GetxController with GetTickerProviderStateMixin { try { int index = tabController.index; var ctr = tabsCtrList[index]; - ctr().animateToTop(); + ctr( + tag: tabs[index]['type'] == TabType.bangumi + ? TabType.bangumi.name + : tabs[index]['type'] == TabType.cinema + ? TabType.cinema.name + : null) + .animateToTop(); } catch (_) {} } @@ -68,14 +80,14 @@ class HomeController extends GetxController with GetTickerProviderStateMixin { defaultTabs = [...tabsConfig]; tabbarSort = GStorage.setting .get(SettingBoxKey.tabbarSort, - defaultValue: ['live', 'rcmd', 'hot', 'rank', 'bangumi']) + defaultValue: TabType.values.map((item) => item.name).toList()) .map((i) => i.toString()) .toList(); defaultTabs.retainWhere( - (item) => tabbarSort.contains((item['type'] as TabType).id)); + (item) => tabbarSort.contains((item['type'] as TabType).name)); defaultTabs.sort((a, b) => tabbarSort - .indexOf((a['type'] as TabType).id) - .compareTo(tabbarSort.indexOf((b['type'] as TabType).id))); + .indexOf((a['type'] as TabType).name) + .compareTo(tabbarSort.indexOf((b['type'] as TabType).name))); tabs.value = defaultTabs; @@ -83,7 +95,7 @@ class HomeController extends GetxController with GetTickerProviderStateMixin { tabsPageList = tabs.map((e) => e['page']).toList(); tabController = TabController( - initialIndex: max(0, tabbarSort.indexOf(TabType.rcmd.id)), + initialIndex: max(0, tabbarSort.indexOf(TabType.rcmd.name)), length: tabs.length, vsync: this, ); diff --git a/lib/pages/setting/pages/home_tabbar_set.dart b/lib/pages/setting/pages/home_tabbar_set.dart index c67857470..cf754b076 100644 --- a/lib/pages/setting/pages/home_tabbar_set.dart +++ b/lib/pages/setting/pages/home_tabbar_set.dart @@ -25,8 +25,8 @@ class _TabbarSetPageState extends State { .toList(); // 对 tabData 进行排序 defaultTabs.sort((a, b) { - int indexA = tabbarSort.indexOf((a['type'] as TabType).id); - int indexB = tabbarSort.indexOf((b['type'] as TabType).id); + int indexA = tabbarSort.indexOf((a['type'] as TabType).name); + int indexB = tabbarSort.indexOf((b['type'] as TabType).name); // 如果类型在 sortOrder 中不存在,则放在末尾 if (indexA == -1) indexA = tabbarSort.length; @@ -38,8 +38,8 @@ class _TabbarSetPageState extends State { void saveEdit() { List sortedTabbar = defaultTabs - .where((i) => tabbarSort.contains((i['type'] as TabType).id)) - .map((i) => (i['type'] as TabType).id) + .where((i) => tabbarSort.contains((i['type'] as TabType).name)) + .map((i) => (i['type'] as TabType).name) .toList(); GStorage.setting.put(SettingBoxKey.tabbarSort, sortedTabbar); SmartDialog.showToast('保存成功,下次启动时生效'); @@ -61,9 +61,9 @@ class _TabbarSetPageState extends State { for (int i = 0; i < defaultTabs.length; i++) ...[ CheckboxListTile( key: Key(defaultTabs[i]['label']), - value: tabbarSort.contains((defaultTabs[i]['type'] as TabType).id), + value: tabbarSort.contains((defaultTabs[i]['type'] as TabType).name), onChanged: (bool? newValue) { - String tabTypeId = (defaultTabs[i]['type'] as TabType).id; + String tabTypeId = (defaultTabs[i]['type'] as TabType).name; if (!newValue!) { tabbarSort.remove(tabTypeId); } else {