From 8197bf116d0bb501818a601de8af6f9a4f5ee880 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Thu, 12 Sep 2024 17:47:58 +0800 Subject: [PATCH] refactor: bangumi intro --- lib/http/search.dart | 16 +++++ .../bangumi/introduction/controller.dart | 66 +++++++++---------- lib/pages/bangumi/introduction/view.dart | 54 ++++++--------- lib/pages/history/widgets/item.dart | 2 +- lib/pages/video/detail/view.dart | 19 ++++-- lib/plugin/pl_player/view.dart | 13 ++-- lib/services/audio_handler.dart | 2 +- 7 files changed, 94 insertions(+), 78 deletions(-) diff --git a/lib/http/search.dart b/lib/http/search.dart index c8c0c4eec..eb72dcc82 100644 --- a/lib/http/search.dart +++ b/lib/http/search.dart @@ -146,6 +146,22 @@ class SearchHttp { } } + static Future bangumiInfoNew({int? seasonId, int? epId}) async { + final dynamic res = await Request().get( + Api.bangumiInfo, + data: { + if (seasonId != null) 'season_id': seasonId, + if (epId != null) 'ep_id': epId, + }, + ); + if (res.data['code'] == 0) { + return LoadingState.success( + BangumiInfoModel.fromJson(res.data['result'])); + } else { + return LoadingState.error(res.data['message']); + } + } + static Future> bangumiInfo( {int? seasonId, int? epId}) async { final Map data = {}; diff --git a/lib/pages/bangumi/introduction/controller.dart b/lib/pages/bangumi/introduction/controller.dart index 6798e2d29..15ada06cc 100644 --- a/lib/pages/bangumi/introduction/controller.dart +++ b/lib/pages/bangumi/introduction/controller.dart @@ -1,3 +1,5 @@ +import 'package:PiliPalaX/http/loading_state.dart'; +import 'package:PiliPalaX/pages/common/common_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -17,7 +19,7 @@ import 'package:PiliPalaX/utils/storage.dart'; import 'package:share_plus/share_plus.dart'; import 'package:url_launcher/url_launcher.dart'; -class BangumiIntroController extends GetxController { +class BangumiIntroController extends CommonController { // 视频bvid String bvid = Get.parameters['bvid'] ?? ''; var seasonId = Get.parameters['seasonId'] != null @@ -34,15 +36,6 @@ class BangumiIntroController extends GetxController { Map? videoItem = {}; BangumiInfoModel? bangumiItem; - // 请求状态 - RxBool isLoading = false.obs; - - // 视频详情 请求返回 - Rx bangumiDetail = BangumiInfoModel().obs; - - // 请求返回的信息 - String responseMsg = '请求异常'; - // up主粉丝数 Map userStat = {'follower': '-'}; @@ -88,10 +81,7 @@ class BangumiIntroController extends GetxController { } userInfo = userInfoCache.get('userInfoCache'); userLogin = userInfo != null; - } - // 获取番剧简介&选集 - Future queryBangumiIntro() async { if (userLogin) { // 获取点赞状态 queryHasLikeVideo(); @@ -100,16 +90,21 @@ class BangumiIntroController extends GetxController { // 获取收藏状态 queryHasFavVideo(); } - var result = await SearchHttp.bangumiInfo(seasonId: seasonId, epId: epId); - if (result['status']) { - bangumiDetail.value = result['data']; - epId = bangumiDetail.value.episodes!.first.id; - } else { - SmartDialog.showToast(result['msg']); - } - return result; + + queryData(); } + @override + bool customHandleResponse(Success response) { + epId = response.response.episodes!.first.id; + loadingState.value = response; + return true; + } + + @override + Future customGetData() => + SearchHttp.bangumiInfoNew(seasonId: seasonId, epId: epId); + // 获取点赞状态 Future queryHasLikeVideo() async { var result = await VideoHttp.hasLikeVideo(bvid: bvid); @@ -139,8 +134,10 @@ class BangumiIntroController extends GetxController { if (result['status']) { SmartDialog.showToast(!hasLike.value ? result['data']['toast'] : '取消赞'); hasLike.value = !hasLike.value; - bangumiDetail.value.stat!['likes'] = - bangumiDetail.value.stat!['likes'] + (!hasLike.value ? 1 : -1); + dynamic bangumiDetail = (loadingState.value as Success).response; + bangumiDetail.stat!['likes'] = + bangumiDetail.stat!['likes'] + (!hasLike.value ? 1 : -1); + loadingState.value = LoadingState.success(bangumiDetail); hasLike.refresh(); } else { SmartDialog.showToast(result['msg']); @@ -193,8 +190,11 @@ class BangumiIntroController extends GetxController { if (res['status']) { SmartDialog.showToast('投币成功'); hasCoin.value = true; - bangumiDetail.value.stat!['coins'] = - bangumiDetail.value.stat!['coins'] + _tempThemeValue; + dynamic bangumiDetail = + (loadingState.value as Success).response; + bangumiDetail.stat!['coins'] = + bangumiDetail.stat!['coins'] + _tempThemeValue; + loadingState.value = LoadingState.success(bangumiDetail); } else { SmartDialog.showToast(res['msg']); } @@ -300,15 +300,15 @@ class BangumiIntroController extends GetxController { // 追番 Future bangumiAdd() async { - var result = - await VideoHttp.bangumiAdd(seasonId: bangumiDetail.value.seasonId); + var result = await VideoHttp.bangumiAdd( + seasonId: (loadingState.value as Success).response.seasonId); SmartDialog.showToast(result['msg']); } // 取消追番 Future bangumiDel() async { - var result = - await VideoHttp.bangumiDel(seasonId: bangumiDetail.value.seasonId); + var result = await VideoHttp.bangumiDel( + seasonId: (loadingState.value as Success).response.seasonId); SmartDialog.showToast(result['msg']); } @@ -323,8 +323,8 @@ class BangumiIntroController extends GetxController { bool prevPlay() { late List episodes; - if (bangumiDetail.value.episodes != null) { - episodes = bangumiDetail.value.episodes!; + if ((loadingState.value as Success).response.episodes != null) { + episodes = (loadingState.value as Success).response.episodes!; } VideoDetailController videoDetailCtr = Get.find(tag: Get.arguments['heroTag']); @@ -353,8 +353,8 @@ class BangumiIntroController extends GetxController { Get.find(tag: Get.arguments['heroTag']); PlayRepeat platRepeat = videoDetailCtr.plPlayerController.playRepeat; - if (bangumiDetail.value.episodes != null) { - episodes = bangumiDetail.value.episodes!; + if ((loadingState.value as Success).response.episodes != null) { + episodes = (loadingState.value as Success).response.episodes!; } else { if (platRepeat == PlayRepeat.autoPlayRelated) { return playRelated(); diff --git a/lib/pages/bangumi/introduction/view.dart b/lib/pages/bangumi/introduction/view.dart index 919d02a4a..01d1176e1 100644 --- a/lib/pages/bangumi/introduction/view.dart +++ b/lib/pages/bangumi/introduction/view.dart @@ -1,3 +1,5 @@ +import 'package:PiliPalaX/common/widgets/http_error.dart'; +import 'package:PiliPalaX/http/loading_state.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -36,7 +38,6 @@ class _BangumiIntroPanelState extends State with AutomaticKeepAliveClientMixin { late BangumiIntroController bangumiIntroController; late VideoDetailController videoDetailCtr; - BangumiInfoModel? bangumiDetail; late Future _futureBuilderFuture; late int cid; late String heroTag; @@ -53,10 +54,6 @@ class _BangumiIntroPanelState extends State cid = widget.cid!; bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag); videoDetailCtr = Get.find(tag: heroTag); - bangumiIntroController.bangumiDetail.listen((BangumiInfoModel value) { - bangumiDetail = value; - }); - _futureBuilderFuture = bangumiIntroController.queryBangumiIntro(); videoDetailCtr.cid.listen((int p0) { cid = p0; if (!mounted) return; @@ -67,35 +64,26 @@ class _BangumiIntroPanelState extends State @override Widget build(BuildContext context) { super.build(context); - return FutureBuilder( - future: _futureBuilderFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - if (snapshot.data['status']) { - // 请求成功 + return Obx(() => _buildBody(bangumiIntroController.loadingState.value)); + } - return BangumiInfo( - loadingStatus: false, - bangumiDetail: bangumiDetail, - cid: cid, - ); - } else { - // 请求错误 - // return HttpError( - // errMsg: snapshot.data['msg'], - // fn: () => Get.back(), - // ); - return const SizedBox(); - } - } else { - return BangumiInfo( - loadingStatus: true, - bangumiDetail: bangumiDetail, + _buildBody(LoadingState loadingState) { + return loadingState is Success + ? BangumiInfo( + loadingStatus: false, + bangumiDetail: loadingState.response, cid: cid, - ); - } - }, - ); + ) + : loadingState is Error + ? HttpError( + errMsg: loadingState.errMsg, + fn: bangumiIntroController.onReload, + ) + : BangumiInfo( + loadingStatus: true, + bangumiDetail: null, + cid: cid, + ); } } @@ -218,7 +206,7 @@ class _BangumiInfoState extends State { const SizedBox(width: 10), Expanded( child: InkWell( - onTap: () => showIntroDetail(), + onTap: showIntroDetail, child: SizedBox( height: isLandscape ? 103 : 158, child: Column( diff --git a/lib/pages/history/widgets/item.dart b/lib/pages/history/widgets/item.dart index c539635a9..c936e245e 100644 --- a/lib/pages/history/widgets/item.dart +++ b/lib/pages/history/widgets/item.dart @@ -325,7 +325,7 @@ class VideoContent extends StatelessWidget { videoItem.title, textAlign: TextAlign.start, style: const TextStyle( - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w400, letterSpacing: 0.3, ), maxLines: videoItem.videos > 1 ? 1 : 2, diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index add0d0b25..fe30760f7 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'dart:math'; import 'package:PiliPalaX/common/constants.dart'; +import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/utils/extension.dart'; import 'package:auto_orientation/auto_orientation.dart'; import 'package:floating/floating.dart'; @@ -90,15 +91,21 @@ class _VideoDetailPageState extends State value, videoDetailController.cid.value); }); bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag); - bangumiIntroController.bangumiDetail.listen((value) { + bangumiIntroController.loadingState.listen((value) { if (!context.mounted) return; - videoPlayerServiceHandler.onVideoDetailChange( - value, videoDetailController.cid.value); + if (value is Success) { + videoPlayerServiceHandler.onVideoDetailChange( + value.response, + videoDetailController.cid.value, + ); + } }); videoDetailController.cid.listen((p0) { if (!context.mounted) return; videoPlayerServiceHandler.onVideoDetailChange( - bangumiIntroController.bangumiDetail.value, p0); + (bangumiIntroController.loadingState.value as Success).response, + p0, + ); }); autoExitFullscreen = setting.get(SettingBoxKey.enableAutoExit, defaultValue: true); @@ -272,7 +279,6 @@ class _VideoDetailPageState extends State floating.dispose(); videoDetailController.floating?.dispose(); videoIntroController.videoDetail.close(); - bangumiIntroController.bangumiDetail.close(); videoDetailController.cid.close(); if (!horizontalScreen) { AutoOrientation.portraitUpMode(); @@ -650,7 +656,8 @@ class _VideoDetailPageState extends State (horizontalScreen || MediaQuery.of(context).orientation == Orientation.portrait), - onPopInvokedWithResult: (bool didPop, Object? result) { + onPopInvokedWithResult: + (bool didPop, Object? result) { if (isFullScreen.value == true) { plPlayerController! .triggerFullScreen(status: false); diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index d7a7f4233..c4a031fc4 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:ui'; +import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/video/detail/introduction/controller.dart'; import 'package:PiliPalaX/utils/id_utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; @@ -226,7 +227,7 @@ class _PLVideoPlayerState extends State bool isSeason = videoIntroController?.videoDetail.value.ugcSeason != null; bool isPage = videoIntroController?.videoDetail.value.pages != null && videoIntroController!.videoDetail.value.pages!.length > 1; - bool isBangumi = bangumiIntroController?.bangumiDetail.value != null; + bool isBangumi = bangumiIntroController?.loadingState.value is Success; bool anySeason = isSeason || isPage || isBangumi; Map videoProgressWidgets = { /// 上一集 @@ -357,7 +358,9 @@ class _PLVideoPlayerState extends State changeFucCall = videoIntroController!.changeSeasonOrbangu; } else if (isBangumi) { episodes.addAll( - bangumiIntroController!.bangumiDetail.value.episodes!); + (bangumiIntroController!.loadingState.value as Success) + .response + .episodes!); changeFucCall = bangumiIntroController!.changeSeasonOrbangu; } ListSheet( @@ -1241,7 +1244,8 @@ class _PLVideoPlayerState extends State Duration.zero, player.state.duration, ); - widget.controller.seekTo(result, type: 'slider'); + widget.controller + .seekTo(result, type: 'slider'); widget.controller.play(); }, ), @@ -1286,7 +1290,8 @@ class _PLVideoPlayerState extends State Duration.zero, player.state.duration, ); - widget.controller.seekTo(result, type: 'slider'); + widget.controller + .seekTo(result, type: 'slider'); widget.controller.play(); }, ), diff --git a/lib/services/audio_handler.dart b/lib/services/audio_handler.dart index 6a95cb0e7..5b9ab3448 100644 --- a/lib/services/audio_handler.dart +++ b/lib/services/audio_handler.dart @@ -111,7 +111,7 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { if (!PlPlayerController.instanceExists()) return; if (data == null) return; - late MediaItem? mediaItem; + MediaItem? mediaItem; if (data is VideoDetailData) { if ((data.pages?.length ?? 0) > 1) { final current = data.pages?.firstWhere((element) => element.cid == cid);