fix: reverse play

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-12-30 23:23:20 +08:00
parent cbe814fdd6
commit 20a89fbccb
6 changed files with 51 additions and 40 deletions

View File

@@ -64,6 +64,10 @@ class _ListSheetContentState extends State<ListSheetContent>
@override
void didUpdateWidget(ListSheetContent oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.showTitle != false) {
return;
}
int currentIndex = _currentIndex;
void jumpToCurrent() {
@@ -97,7 +101,7 @@ class _ListSheetContentState extends State<ListSheetContent>
void initState() {
super.initState();
if (_isList) {
_indexStream ??= StreamController<int>();
_indexStream ??= StreamController<int>.broadcast();
_ctr = TabController(
vsync: this,
length: widget.season.sections.length,
@@ -358,29 +362,22 @@ class _ListSheetContentState extends State<ListSheetContent>
},
),
if (widget.season != null)
_mediumButton(
tooltip: '倒序播放',
icon: Icons.u_turn_right,
onPressed: () async {
// jump to current
if (_ctr != null && _ctr?.index != (_index)) {
_ctr?.animateTo(_index);
await Future.delayed(const Duration(milliseconds: 225));
}
try {
itemScrollController[_ctr?.index ?? 0].scrollTo(
index: currentIndex,
duration: const Duration(milliseconds: 200),
);
} catch (_) {}
widget.onReverse?.call();
},
),
if (!_isList)
_reverseButton
else
StreamBuilder(
stream: _indexStream?.stream,
initialData: _index,
builder: (context, snapshot) {
return snapshot.data == _index
? _reverseButton
: const SizedBox.shrink();
},
),
const Spacer(),
StreamBuilder(
stream: _indexStream?.stream,
initialData: 0,
initialData: _index,
builder: (context, snapshot) => _mediumButton(
tooltip: reverse[snapshot.data] ? '正序' : '反序',
icon: !reverse[snapshot.data]
@@ -436,6 +433,28 @@ class _ListSheetContentState extends State<ListSheetContent>
);
}
Widget get _reverseButton => _mediumButton(
tooltip: '倒序播放',
icon: Icons.u_turn_right,
onPressed: () async {
if (widget.showTitle == false) {
// jump to current
if (_ctr != null && _ctr?.index != (_index)) {
_ctr?.animateTo(_index);
await Future.delayed(const Duration(milliseconds: 225));
}
try {
itemScrollController[_ctr?.index ?? 0].scrollTo(
index: currentIndex,
duration: const Duration(milliseconds: 200),
);
} catch (_) {}
}
widget.onReverse?.call();
},
);
Widget _mediumButton({
String? tooltip,
IconData? icon,

View File

@@ -127,7 +127,6 @@ class _BangumiPanelState extends State<BangumiPanel> {
widget.pages[currentIndex].bvid,
widget.pages[currentIndex].aid,
cid,
null,
),
child: Text(
widget.newEp?['desc']?.contains('连载') == true

View File

@@ -102,7 +102,6 @@ class _PagesPanelState extends State<PagesPanel> {
widget.bvid,
IdUtils.bv2av(widget.bvid),
cid,
null,
),
child: Text(
'${widget.pages.length}',

View File

@@ -29,7 +29,7 @@ class SeasonPanel extends StatefulWidget {
}
class _SeasonPanelState extends State<SeasonPanel> {
int currentIndex = 0;
RxInt currentIndex = 0.obs;
late VideoDetailController _videoDetailController;
StreamSubscription? _listener;
List<EpisodeItem> episodes = <EpisodeItem>[];
@@ -52,7 +52,7 @@ class _SeasonPanelState extends State<SeasonPanel> {
// episodes = widget.ugcSeason.sections!
// .firstWhere((e) => e.seasonId == widget.ugcSeason.id)
// .episodes;
currentIndex = episodes.indexWhere(
currentIndex.value = episodes.indexWhere(
(EpisodeItem e) => e.cid == _videoDetailController.seasonCid);
_listener = _videoDetailController.cid.listen((int p0) {
if (widget.pages != null && widget.pages!.length != 1) {
@@ -61,10 +61,9 @@ class _SeasonPanelState extends State<SeasonPanel> {
}
_videoDetailController.seasonCid = p0;
_findEpisode();
currentIndex = episodes.indexWhere(
currentIndex.value = episodes.indexWhere(
(EpisodeItem e) => e.cid == _videoDetailController.seasonCid);
if (!mounted) return;
setState(() {});
});
}
@@ -112,11 +111,6 @@ class _SeasonPanelState extends State<SeasonPanel> {
_videoDetailController.bvid,
null,
_videoDetailController.seasonCid,
() {
setState(() {
currentIndex = episodes.length - 1 - currentIndex;
});
},
),
child: Padding(
padding: const EdgeInsets.fromLTRB(8, 12, 8, 12),
@@ -137,11 +131,13 @@ class _SeasonPanelState extends State<SeasonPanel> {
semanticLabel: "正在播放:",
),
const SizedBox(width: 10),
Text(
'${currentIndex + 1}/${episodes.length}',
style: Theme.of(context).textTheme.labelMedium,
semanticsLabel:
'${currentIndex + 1}集,共${episodes.length}',
Obx(
() => Text(
'${currentIndex.value + 1}/${episodes.length}',
style: Theme.of(context).textTheme.labelMedium,
semanticsLabel:
'${currentIndex.value + 1}集,共${episodes.length}',
),
),
const SizedBox(width: 6),
const Icon(

View File

@@ -1577,7 +1577,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
);
}
showEpisodes(index, season, episodes, bvid, aid, cid, onReverse) {
showEpisodes(index, season, episodes, bvid, aid, cid) {
Widget listSheetContent() => ListSheetContent(
index: index,
season: season,
@@ -1600,7 +1600,6 @@ class _VideoDetailPageState extends State<VideoDetailPage>
onReverse: () {
Get.back();
onReversePlay();
onReverse();
},
);
if (isFullScreen) {

View File

@@ -411,7 +411,6 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
bvid,
IdUtils.bv2av(bvid),
currentCid,
null,
);
},
),