diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 1eb23d6a378..7de2bc64061 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.8.7 +* Ensures that `value.position` never reports a value larger than `value.duration`. * Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. ## 2.8.6 diff --git a/packages/video_player/video_player/example/integration_test/video_player_test.dart b/packages/video_player/video_player/example/integration_test/video_player_test.dart index d475a1ac5ef..0acebb548c2 100644 --- a/packages/video_player/video_player/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player/example/integration_test/video_player_test.dart @@ -194,9 +194,11 @@ void main() { testWidgets('test video player view with local asset', (WidgetTester tester) async { + final Completer loaded = Completer(); Future started() async { await controller.initialize(); await controller.play(); + loaded.complete(); return true; } @@ -221,12 +223,12 @@ void main() { ), )); + await loaded.future; await tester.pumpAndSettle(); expect(controller.value.isPlaying, true); }, - skip: kIsWeb || // Web does not support local assets. - // Extremely flaky on iOS: https://github.com/flutter/flutter/issues/86915 - defaultTargetPlatform == TargetPlatform.iOS); + // Web does not support local assets. + skip: kIsWeb); }); group('file-based videos', () { diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index 007c6ba14e5..4d7f68e7272 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -743,6 +743,12 @@ class VideoPlayerController extends ValueNotifier { } void _updatePosition(Duration position) { + // The underlying native implementation on some platforms sometimes reports + // a position slightly past the reported max duration. Clamp to the duration + // to insulate clients from this behavior. + if (position > value.duration) { + position = value.duration; + } value = value.copyWith( position: position, caption: _getCaptionAt(position), diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 0dbdd0c9062..9ed1b6f7e29 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for displaying inline video with other Flutter widgets on Android, iOS, and web. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.8.6 +version: 2.8.7 environment: sdk: ">=3.2.3 <4.0.0"