Merge branch 'fix-seasonChange'

This commit is contained in:
guozhigq
2024-11-24 22:54:21 +08:00
4 changed files with 48 additions and 40 deletions

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/constants.dart';
@ -98,7 +99,8 @@ class _PagesBottomSheetState extends State<PagesBottomSheet>
with TickerProviderStateMixin { with TickerProviderStateMixin {
final ScrollController _listScrollController = ScrollController(); final ScrollController _listScrollController = ScrollController();
late ListObserverController _listObserverController; late ListObserverController _listObserverController;
final ScrollController _scrollController = ScrollController(); late GridObserverController _gridObserverController;
final ScrollController _gridScrollController = ScrollController();
late int currentIndex; late int currentIndex;
TabController? tabController; TabController? tabController;
List<ListObserverController>? _listObserverControllerList; List<ListObserverController>? _listObserverControllerList;
@ -163,6 +165,9 @@ class _PagesBottomSheetState extends State<PagesBottomSheet>
); );
}, },
); );
} else {
_gridObserverController =
GridObserverController(controller: _gridScrollController);
} }
} }
@ -185,18 +190,12 @@ class _PagesBottomSheetState extends State<PagesBottomSheet>
); );
} }
} }
} else {
_gridObserverController.initialIndexModel = ObserverIndexPositionModel(
index: currentIndex,
isFixedHeight: false,
);
} }
WidgetsBinding.instance.addPostFrameCallback((_) {
if (widget.dataType != VideoEpidoesType.videoEpisode) {
double itemHeight = (widget.isFullScreen
? 400
: Get.size.width - 3 * StyleString.safeSpace) /
5.2;
double offset = ((currentIndex - 1) / 2).ceil() * itemHeight;
_scrollController.jumpTo(offset);
}
});
} }
// 获取订阅状态 // 获取订阅状态
@ -236,7 +235,9 @@ class _PagesBottomSheetState extends State<PagesBottomSheet>
void dispose() { void dispose() {
try { try {
_listObserverController.controller?.dispose(); _listObserverController.controller?.dispose();
_gridObserverController.controller?.dispose();
_listScrollController.dispose(); _listScrollController.dispose();
_gridScrollController.dispose();
for (var element in _listObserverControllerList!) { for (var element in _listObserverControllerList!) {
element.controller?.dispose(); element.controller?.dispose();
} }
@ -303,24 +304,27 @@ class _PagesBottomSheetState extends State<PagesBottomSheet>
: Padding( : Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 12.0), // 设置左右间距为12 horizontal: 12.0), // 设置左右间距为12
child: GridView.count( child: GridViewObserver(
controller: _scrollController, controller: _gridObserverController,
crossAxisCount: 2, child: GridView.count(
crossAxisSpacing: StyleString.safeSpace, controller: _gridScrollController,
childAspectRatio: 2.6, crossAxisCount: 2,
children: List.generate( crossAxisSpacing: StyleString.safeSpace,
widget.episodes.length, childAspectRatio: 2.6,
(index) { children: List.generate(
bool isCurrentIndex = currentIndex == index; widget.episodes.length,
return EpisodeGridItem( (index) {
episode: widget.episodes[index], bool isCurrentIndex = currentIndex == index;
index: index, return EpisodeGridItem(
isCurrentIndex: isCurrentIndex, episode: widget.episodes[index],
dataType: widget.dataType, index: index,
changeFucCall: widget.changeFucCall, isCurrentIndex: isCurrentIndex,
isFullScreen: widget.isFullScreen, dataType: widget.dataType,
); changeFucCall: widget.changeFucCall,
}, isFullScreen: widget.isFullScreen,
);
},
),
), ),
), ),
), ),

View File

@ -88,15 +88,14 @@ class VideoIntroController extends GetxController {
} }
// 获取视频简介&分p // 获取视频简介&分p
Future queryVideoIntro({cover}) async { Future queryVideoIntro({String? cover, String? type, int? cid}) async {
var result = await VideoHttp.videoIntro(bvid: bvid); var result = await VideoHttp.videoIntro(bvid: bvid);
if (result['status']) { if (result['status']) {
videoDetail.value = result['data']!; videoDetail.value = result['data']!;
ugcSeason = result['data']!.ugcSeason; ugcSeason = result['data']!.ugcSeason;
pages.value = result['data']!.pages!; pages.value = result['data']!.pages!;
lastPlayCid.value = videoDetail.value.cid!; if (type == null) {
if (pages.isNotEmpty) { lastPlayCid.value = cid ?? videoDetail.value.cid!;
lastPlayCid.value = pages.first.cid!;
} }
final VideoDetailController videoDetailCtr = final VideoDetailController videoDetailCtr =
Get.find<VideoDetailController>(tag: heroTag); Get.find<VideoDetailController>(tag: heroTag);
@ -482,7 +481,8 @@ class VideoIntroController extends GetxController {
} }
} catch (_) {} } catch (_) {}
this.bvid = bvid; this.bvid = bvid;
await queryVideoIntro(cover: cover); // 点击切换时优先取当前cid
await queryVideoIntro(cover: cover, cid: cid);
} }
void startTimer() { void startTimer() {

View File

@ -57,7 +57,7 @@ class _VideoIntroPanelState extends State<VideoIntroPanel>
heroTag = Get.arguments['heroTag']; heroTag = Get.arguments['heroTag'];
videoIntroController = videoIntroController =
Get.put(VideoIntroController(bvid: widget.bvid), tag: heroTag); Get.put(VideoIntroController(bvid: widget.bvid), tag: heroTag);
_futureBuilderFuture = videoIntroController.queryVideoIntro(); _futureBuilderFuture = videoIntroController.queryVideoIntro(type: 'init');
videoIntroController.videoDetail.listen((value) { videoIntroController.videoDetail.listen((value) {
videoDetail = value; videoDetail = value;
}); });

View File

@ -27,7 +27,7 @@ class SeasonPanel extends StatefulWidget {
} }
class _SeasonPanelState extends State<SeasonPanel> { class _SeasonPanelState extends State<SeasonPanel> {
late List<EpisodeItem> episodes; List<EpisodeItem>? episodes;
late int cid; late int cid;
late RxInt currentIndex = (-1).obs; late RxInt currentIndex = (-1).obs;
final String heroTag = Get.arguments['heroTag']; final String heroTag = Get.arguments['heroTag'];
@ -75,7 +75,10 @@ class _SeasonPanelState extends State<SeasonPanel> {
// 获取currentIndex // 获取currentIndex
void getCurrentIndex() { void getCurrentIndex() {
currentIndex.value = episodes.indexWhere((EpisodeItem e) => e.cid == cid); if (episodes != null) {
currentIndex.value =
episodes!.indexWhere((EpisodeItem e) => e.cid == cid);
}
final List<SectionItem> sections = widget.ugcSeason.sections!; final List<SectionItem> sections = widget.ugcSeason.sections!;
if (sections.length == 1 && sections.first.type == 1) { if (sections.length == 1 && sections.first.type == 1) {
final List<EpisodeItem> episodesList = sections.first.episodes!; final List<EpisodeItem> episodesList = sections.first.episodes!;
@ -83,6 +86,7 @@ class _SeasonPanelState extends State<SeasonPanel> {
for (int j = 0; j < episodesList[i].pages!.length; j++) { for (int j = 0; j < episodesList[i].pages!.length; j++) {
if (episodesList[i].pages![j].cid == cid) { if (episodesList[i].pages![j].cid == cid) {
currentIndex.value = i; currentIndex.value = i;
episodes = episodesList;
continue; continue;
} }
} }
@ -137,7 +141,7 @@ class _SeasonPanelState extends State<SeasonPanel> {
widget.videoIntroCtr.bottomSheetController = widget.videoIntroCtr.bottomSheetController =
_bottomSheetController = EpisodeBottomSheet( _bottomSheetController = EpisodeBottomSheet(
currentCid: cid, currentCid: cid,
episodes: episodes, episodes: episodes!,
changeFucCall: changeFucCall, changeFucCall: changeFucCall,
sheetHeight: widget.sheetHeight, sheetHeight: widget.sheetHeight,
dataType: VideoEpidoesType.videoEpisode, dataType: VideoEpidoesType.videoEpisode,
@ -165,7 +169,7 @@ class _SeasonPanelState extends State<SeasonPanel> {
), ),
const SizedBox(width: 10), const SizedBox(width: 10),
Obx(() => Text( Obx(() => Text(
'${currentIndex.value + 1}/${episodes.length}', '${currentIndex.value + 1}/${episodes!.length}',
style: Theme.of(context).textTheme.labelMedium, style: Theme.of(context).textTheme.labelMedium,
)), )),
const SizedBox(width: 6), const SizedBox(width: 6),