diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md index 8e9e9f21f73..bdac43ac99a 100644 --- a/packages/video_player/video_player_web/CHANGELOG.md +++ b/packages/video_player/video_player_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.2.1 + +* Fixes infinite pause loop caused by `seekTo` marking the video as completed when already completed. + ## 2.2.0 * Updates SDK version to Dart `^3.3.0`. Flutter `^3.19.0`. diff --git a/packages/video_player/video_player_web/lib/src/video_player.dart b/packages/video_player/video_player_web/lib/src/video_player.dart index 4adb2e1e866..c665b91eed8 100644 --- a/packages/video_player/video_player_web/lib/src/video_player.dart +++ b/packages/video_player/video_player_web/lib/src/video_player.dart @@ -205,8 +205,20 @@ class VideoPlayer { /// Moves the playback head to a new `position`. /// /// `position` cannot be negative. + /// + /// Does nothing if the new position is the same as the current position. void seekTo(Duration position) { assert(!position.isNegative); + // Don't seek if video is already at target position. + // + // This is needed because the core plugin will pause and seek to the end of + // the video when it finishes, and that causes an infinite loop of `ended` + // events on the web. + // + // See: https://github.com/flutter/flutter/issues/77674 + if (position.inMilliseconds == _videoCurrentTimeInMilliseconds) { + return; + } _videoElement.currentTime = position.inMilliseconds.toDouble() / 1000; } @@ -214,9 +226,12 @@ class VideoPlayer { /// Returns the current playback head position as a [Duration]. Duration getPosition() { _sendBufferingRangesUpdate(); - return Duration(milliseconds: (_videoElement.currentTime * 1000).round()); + return Duration(milliseconds: _videoCurrentTimeInMilliseconds); } + int get _videoCurrentTimeInMilliseconds => + (_videoElement.currentTime * 1000).round(); + /// Sets options Future setOptions(VideoPlayerWebOptions options) async { // In case this method is called multiple times, reset options. diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml index 0cb69f88b74..dee0627505d 100644 --- a/packages/video_player/video_player_web/pubspec.yaml +++ b/packages/video_player/video_player_web/pubspec.yaml @@ -2,7 +2,8 @@ name: video_player_web description: Web platform implementation of video_player. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.2.0 + +version: 2.2.1 environment: sdk: ^3.3.0