修复章节列表滚动 在windows平台报错

This commit is contained in:
rang 2025-10-24 13:46:36 +08:00
parent 620a1eb7a2
commit 05bc0cde74
7 changed files with 32 additions and 12 deletions

View file

@ -174,12 +174,31 @@ class AudiobookPlayer extends AudioPlayer {
};
}
// @override
// Future<void> seek(Duration? positionInBook, {int? index, bool b = true}) async {
// if (!b) {
// return super.seek(positionInBook, index: index);
// }
// if (_book == null) {
// _logger.warning('No book is set, not seeking');
// return;
// }
// if (positionInBook == null) {
// _logger.warning('Position given is null, not seeking');
// return;
// }
// final tracks = _book!.tracks;
// final trackToPlay = getTrackToPlay(_book!, positionInBook);
// final i = tracks.indexOf(trackToPlay);
// final positionInTrack = positionInBook - trackToPlay.startOffset;
// return super.seek(positionInTrack, index: i);
// }
/// need to override getDuration and getCurrentPosition to return according to the book instead of the current track
/// this is because the book can be a list of audio files and the player is only aware of the current track
/// so we need to calculate the duration and current position based on the book
@override
Future<void> seek(Duration? positionInBook, {int? index, bool b = true}) async {
Future<void> seekInBook(Duration? positionInBook, {int? index, bool b = true}) async {
if (!b) {
return super.seek(positionInBook, index: index);
}
@ -208,11 +227,11 @@ class AudiobookPlayer extends AudioPlayer {
void seekForward() {
final index = _book!.chapters.indexOf(currentChapter!);
if (index < _book!.chapters.length - 1) {
seek(
super.seek(
_book!.chapters[index + 1].start + offset,
);
} else {
seek(currentChapter!.end);
super.seek(currentChapter!.end);
}
}
@ -227,7 +246,7 @@ class AudiobookPlayer extends AudioPlayer {
} else {
chapterToSeekTo = currentChapter!;
}
seek(
super.seek(
chapterToSeekTo.start + offset,
);
}

View file

@ -165,7 +165,7 @@ class AudiobookPlayerPlayPauseButton extends HookConsumerWidget {
),
ProcessingState.completed => IconButton(
onPressed: () async {
await player.seek(const Duration(seconds: 0));
await player.seekInBook(const Duration(seconds: 0));
await player.play();
},
icon: const Icon(
@ -220,7 +220,7 @@ class AudiobookChapterProgressBar extends HookConsumerWidget {
: currentChapter.end - currentChapter.start,
// ! TODO add onSeek
onSeek: (duration) {
player.seek(
player.seekInBook(
duration + (currentChapter?.start ?? const Duration(seconds: 0)),
);
},

View file

@ -201,6 +201,7 @@ class PlayerWhenExpanded extends HookConsumerWidget {
// the chapter skip buttons, seek 30 seconds back and forward, and play/pause button
Expanded(
flex: 2,
child: Opacity(
opacity: earlyPercentage,
child: SizedBox(

View file

@ -22,9 +22,9 @@ class AudiobookPlayerSeekButton extends HookConsumerWidget {
),
onPressed: () {
if (isForward) {
player.seek(player.positionInBook + const Duration(seconds: 30));
player.seek(player.position + const Duration(seconds: 30));
} else {
player.seek(player.positionInBook - const Duration(seconds: 30));
player.seek(player.position - const Duration(seconds: 30));
}
},
);

View file

@ -65,7 +65,7 @@ class AudiobookPlayerSeekChapterButton extends HookConsumerWidget {
}
// if chapter does not exist, go to the start or end of the book
if (player.currentChapter == null) {
player.seek(isForward ? player.book!.duration : Duration.zero);
player.seekInBook(isForward ? player.book!.duration : Duration.zero);
return;
}
if (isForward) {

View file

@ -112,7 +112,7 @@ class ChapterSelectionModal extends HookConsumerWidget {
key: isCurrent ? chapterKey : null,
onTap: () {
Navigator.of(context).pop();
notifier.seek(chapter.start + 90.ms);
notifier.seekInBook(chapter.start + 90.ms);
notifier.play();
},
);