[video_player] Ensure seekTo is not called before video player is initialized. (#4300)
diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md
index f07bb5f..9cb642a 100644
--- a/packages/video_player/video_player/CHANGELOG.md
+++ b/packages/video_player/video_player/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 2.1.15
+* Ensured seekTo isn't called before video player is initialized. Fixes [#89259](https://github.com/flutter/flutter/issues/89259).
* Updated Android lint settings.
## 2.1.14
diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart
index 7724092..b4c4b2b 100644
--- a/packages/video_player/video_player/lib/video_player.dart
+++ b/packages/video_player/video_player/lib/video_player.dart
@@ -415,14 +415,14 @@
}
Future<void> _applyLooping() async {
- if (!value.isInitialized || _isDisposed) {
+ if (_isDisposedOrNotInitialized) {
return;
}
await _videoPlayerPlatform.setLooping(_textureId, value.isLooping);
}
Future<void> _applyPlayPause() async {
- if (!value.isInitialized || _isDisposed) {
+ if (_isDisposedOrNotInitialized) {
return;
}
if (value.isPlaying) {
@@ -455,14 +455,14 @@
}
Future<void> _applyVolume() async {
- if (!value.isInitialized || _isDisposed) {
+ if (_isDisposedOrNotInitialized) {
return;
}
await _videoPlayerPlatform.setVolume(_textureId, value.volume);
}
Future<void> _applyPlaybackSpeed() async {
- if (!value.isInitialized || _isDisposed) {
+ if (_isDisposedOrNotInitialized) {
return;
}
@@ -491,7 +491,7 @@
/// If [moment] is outside of the video's full range it will be automatically
/// and silently clamped.
Future<void> seekTo(Duration position) async {
- if (_isDisposed) {
+ if (_isDisposedOrNotInitialized) {
return;
}
if (position > value.duration) {
@@ -572,6 +572,8 @@
value = value.copyWith(position: position);
value = value.copyWith(caption: _getCaptionAt(position));
}
+
+ bool get _isDisposedOrNotInitialized => _isDisposed || !value.isInitialized;
}
class _VideoAppLifeCycleObserver extends Object with WidgetsBindingObserver {
diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml
index 0d0cdb1..7f6f608 100644
--- a/packages/video_player/video_player/pubspec.yaml
+++ b/packages/video_player/video_player/pubspec.yaml
@@ -3,7 +3,7 @@
widgets on Android, iOS, and web.
repository: https://github.com/flutter/plugins/tree/master/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.1.14
+version: 2.1.15
environment:
sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/video_player/video_player/test/video_player_test.dart b/packages/video_player/video_player/test/video_player_test.dart
index b5bfad6..ad536f8 100644
--- a/packages/video_player/video_player/test/video_player_test.dart
+++ b/packages/video_player/video_player/test/video_player_test.dart
@@ -318,6 +318,17 @@
expect(fakeVideoPlayerPlatform.calls.last, 'setPlaybackSpeed');
});
+ test('play before initialized does not call platform', () async {
+ final VideoPlayerController controller = VideoPlayerController.network(
+ 'https://127.0.0.1',
+ );
+ expect(controller.value.isInitialized, isFalse);
+
+ await controller.play();
+
+ expect(fakeVideoPlayerPlatform.calls, isEmpty);
+ });
+
test('play restarts from beginning if video is at end', () async {
final VideoPlayerController controller = VideoPlayerController.network(
'https://127.0.0.1',
@@ -373,6 +384,17 @@
expect(await controller.position, const Duration(milliseconds: 500));
});
+ test('before initialized does not call platform', () async {
+ final VideoPlayerController controller = VideoPlayerController.network(
+ 'https://127.0.0.1',
+ );
+ expect(controller.value.isInitialized, isFalse);
+
+ await controller.seekTo(const Duration(milliseconds: 500));
+
+ expect(fakeVideoPlayerPlatform.calls, isEmpty);
+ });
+
test('clamps values that are too high or low', () async {
final VideoPlayerController controller = VideoPlayerController.network(
'https://127.0.0.1',