diff --git a/lib/pages/video/detail/introduction/controller.dart b/lib/pages/video/detail/introduction/controller.dart index e78d8121..2671f4d8 100644 --- a/lib/pages/video/detail/introduction/controller.dart +++ b/lib/pages/video/detail/introduction/controller.dart @@ -63,6 +63,7 @@ class VideoIntroController extends GetxController { PersistentBottomSheetController? bottomSheetController; late bool enableRelatedVideo; UgcSeason? ugcSeason; + RxList pages = [].obs; @override void onInit() { @@ -84,18 +85,20 @@ class VideoIntroController extends GetxController { } // 获取视频简介&分p - Future queryVideoIntro() async { + Future queryVideoIntro({cover}) async { var result = await VideoHttp.videoIntro(bvid: bvid); if (result['status']) { videoDetail.value = result['data']!; ugcSeason = result['data']!.ugcSeason; - if (videoDetail.value.pages!.isNotEmpty && lastPlayCid.value == 0) { - lastPlayCid.value = videoDetail.value.pages!.first.cid!; + pages.value = result['data']!.pages!; + lastPlayCid.value = videoDetail.value.cid!; + if (pages.isNotEmpty) { + lastPlayCid.value = pages.first.cid!; } final VideoDetailController videoDetailCtr = Get.find(tag: heroTag); videoDetailCtr.tabs.value = ['简介', '评论 ${result['data']?.stat?.reply}']; - videoDetailCtr.cover.value = result['data'].pic ?? ''; + videoDetailCtr.cover.value = cover ?? result['data'].pic ?? ''; // 获取到粉丝数再返回 await queryUserStat(); } @@ -470,8 +473,7 @@ class VideoIntroController extends GetxController { videoReplyCtr.queryReplyList(type: 'init'); } catch (_) {} this.bvid = bvid; - lastPlayCid.value = cid; - await queryVideoIntro(); + await queryVideoIntro(cover: cover); } void startTimer() { @@ -521,9 +523,8 @@ class VideoIntroController extends GetxController { final List episodesList = sections[i].episodes!; episodes.addAll(episodesList); } - } else if (videoDetail.value.pages != null) { + } else if (pages.isNotEmpty) { isPages = true; - final List pages = videoDetail.value.pages!; episodes.addAll(pages); } @@ -621,10 +622,9 @@ class VideoIntroController extends GetxController { } } } - if (videoDetail.value.pages != null && - videoDetail.value.pages!.length > 1) { + if (pages.length > 1) { dataType = VideoEpidoesType.videoPart; - episodes = videoDetail.value.pages!; + episodes = pages; } DrawerUtils.showRightDialog( diff --git a/lib/pages/video/detail/introduction/view.dart b/lib/pages/video/detail/introduction/view.dart index 80176a7b..a02ed530 100644 --- a/lib/pages/video/detail/introduction/view.dart +++ b/lib/pages/video/detail/introduction/view.dart @@ -404,27 +404,18 @@ class _VideoInfoState extends State with TickerProviderStateMixin { Obx( () => SeasonPanel( ugcSeason: widget.videoDetail!.ugcSeason!, - cid: videoIntroController.lastPlayCid.value != 0 - ? videoIntroController.lastPlayCid.value - : widget.videoDetail!.pages!.first.cid, + cid: videoIntroController.lastPlayCid.value, sheetHeight: videoDetailCtr.sheetHeight.value, - changeFuc: (bvid, cid, aid, cover) => - videoIntroController.changeSeasonOrbangu( - bvid, - cid, - aid, - cover, - ), + changeFuc: videoIntroController.changeSeasonOrbangu, videoIntroCtr: videoIntroController, ), ) ], // 合集 videoEpisode - if (widget.videoDetail!.pages != null && - widget.videoDetail!.pages!.length > 1) ...[ + if (videoIntroController.pages.length > 1) ...[ Obx( () => PagesPanel( - pages: widget.videoDetail!.pages!, + pages: videoIntroController.pages, cid: videoIntroController.lastPlayCid.value, sheetHeight: videoDetailCtr.sheetHeight.value, changeFuc: (cid, cover) => diff --git a/lib/pages/video/detail/introduction/widgets/page_panel.dart b/lib/pages/video/detail/introduction/widgets/page_panel.dart index 81a22176..96786804 100644 --- a/lib/pages/video/detail/introduction/widgets/page_panel.dart +++ b/lib/pages/video/detail/introduction/widgets/page_panel.dart @@ -3,7 +3,6 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:pilipala/models/video_detail_res.dart'; -import 'package:pilipala/pages/video/detail/index.dart'; import 'package:pilipala/pages/video/detail/introduction/index.dart'; import '../../../../../common/pages_bottom_sheet.dart'; import '../../../../../models/common/video_episode_type.dart'; @@ -32,25 +31,26 @@ class _PagesPanelState extends State { late int cid; late RxInt currentIndex = (-1).obs; final String heroTag = Get.arguments['heroTag']; - late VideoDetailController _videoDetailController; final ScrollController listViewScrollCtr = ScrollController(); - late PersistentBottomSheetController? _bottomSheetController; + PersistentBottomSheetController? _bottomSheetController; @override void initState() { super.initState(); cid = widget.cid; episodes = widget.pages; - _videoDetailController = Get.find(tag: heroTag); - currentIndex.value = episodes.indexWhere((Part e) => e.cid == cid); - scrollToIndex(); - _videoDetailController.cid.listen((int p0) { + updateCurrentIndexAndScroll(); + widget.videoIntroCtr.lastPlayCid.listen((int p0) { cid = p0; - currentIndex.value = episodes.indexWhere((Part e) => e.cid == cid); - scrollToIndex(); + updateCurrentIndexAndScroll(); }); } + void updateCurrentIndexAndScroll() { + currentIndex.value = widget.pages.indexWhere((Part e) => e.cid == cid); + scrollToIndex(); + } + @override void dispose() { listViewScrollCtr.dispose(); @@ -60,7 +60,10 @@ class _PagesPanelState extends State { void changeFucCall(item, i) async { widget.changeFuc?.call(item.cid, item.cover); currentIndex.value = i; - _bottomSheetController?.close(); + cid = item.cid; + if (_bottomSheetController != null) { + _bottomSheetController?.close(); + } scrollToIndex(); } @@ -112,7 +115,7 @@ class _PagesPanelState extends State { widget.videoIntroCtr.bottomSheetController = _bottomSheetController = EpisodeBottomSheet( currentCid: cid, - episodes: episodes, + episodes: widget.pages, changeFucCall: changeFucCall, sheetHeight: widget.sheetHeight, dataType: VideoEpidoesType.videoPart,