fix(player): 记住拖动后的实际播放位置
This commit is contained in:
1 parent
47ca21406a
commit
5268adc999
8 files changed
+352
-67
No files matched your search
@@ -218,6 +218,75 @@ void main() {
|
||||
logic.dispose();
|
||||
await _drain(logic);
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'should_cache_actual_position_after_seek_completes',
|
||||
(tester) async {
|
||||
late BuildContext context;
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: Builder(
|
||||
builder: (pageContext) {
|
||||
context = pageContext;
|
||||
return const Scaffold(body: SizedBox.expand());
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
final cache = PlaybackPositionCache();
|
||||
final history = FakeWatchHistory();
|
||||
final factory = _VideoRecordingFactory();
|
||||
late PlayerLogic logic;
|
||||
await tester.runAsync(() async {
|
||||
logic = _logic(history, positionCache: cache);
|
||||
logic.attach(
|
||||
PlayerPage(drama: _drama('signal'), initialIndex: 0),
|
||||
isMounted: () => true,
|
||||
);
|
||||
logic.start(
|
||||
factory: factory.create,
|
||||
coordinator: PlaybackCoordinator(),
|
||||
);
|
||||
await _drain(logic);
|
||||
});
|
||||
final player = logic.session.active! as _VideoRecordingPlayer;
|
||||
logic.beginScrub(player);
|
||||
|
||||
await tester.runAsync(
|
||||
() => logic.seekTo(
|
||||
context,
|
||||
player,
|
||||
const Duration(seconds: 42),
|
||||
),
|
||||
);
|
||||
await tester.runAsync(() => logic.pendingWrite);
|
||||
|
||||
expect(
|
||||
cache.read('signal-1', dramaId: 'signal')?.position,
|
||||
const Duration(seconds: 42),
|
||||
);
|
||||
expect(history.writes.last, 'signal-1|42000|false');
|
||||
|
||||
logic.beginScrub(player);
|
||||
await tester.runAsync(
|
||||
() => logic.seekTo(
|
||||
context,
|
||||
player,
|
||||
const Duration(minutes: 2),
|
||||
),
|
||||
);
|
||||
await tester.runAsync(() => logic.pendingWrite);
|
||||
|
||||
expect(player.controller.value.position, const Duration(minutes: 1));
|
||||
expect(
|
||||
cache.read('signal-1', dramaId: 'signal')?.position,
|
||||
const Duration(minutes: 1),
|
||||
);
|
||||
expect(history.writes.last, 'signal-1|60000|false');
|
||||
logic.dispose();
|
||||
await tester.pump();
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
test('should_play_local_file_without_ticket_when_episode_is_downloaded',
|
||||
@@ -1257,6 +1326,18 @@ class _VideoRecordingPlayer extends VideoPlayerPort {
|
||||
@override
|
||||
Future<void> pause() async {}
|
||||
|
||||
@override
|
||||
Future<void> seekTo(Duration position) async {
|
||||
final current = controller.value;
|
||||
controller.value = VideoPlayerValue(
|
||||
duration: current.duration,
|
||||
size: current.size,
|
||||
position: position,
|
||||
isInitialized: current.isInitialized,
|
||||
isPlaying: current.isPlaying,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> dispose() async {
|
||||
if (disposed) return;
|
||||
|
||||
Reference in new issue
Block a user