[video_player] Fix disposed VideoPlayerController throwing an error when calling dispose() again (#5952)
diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md
index 379909b..2b0ffad 100644
--- a/packages/video_player/video_player/CHANGELOG.md
+++ b/packages/video_player/video_player/CHANGELOG.md
@@ -1,6 +1,7 @@
-## NEXT
+## 2.4.5
* Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/104231).
+* Fixes an exception when a disposed VideoPlayerController is disposed again.
## 2.4.4
diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart
index 95bdc07..96aa881 100644
--- a/packages/video_player/video_player/lib/video_player.dart
+++ b/packages/video_player/video_player/lib/video_player.dart
@@ -426,6 +426,10 @@
@override
Future<void> dispose() async {
+ if (_isDisposed) {
+ return;
+ }
+
if (_creatingCompleter != null) {
await _creatingCompleter!.future;
if (!_isDisposed) {
diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml
index 2672399..bb0e8a8 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/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.4.4
+version: 2.4.5
environment:
sdk: ">=2.14.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 f4eda11..728e3a2 100644
--- a/packages/video_player/video_player/test/video_player_test.dart
+++ b/packages/video_player/video_player/test/video_player_test.dart
@@ -373,6 +373,17 @@
expect(await controller.position, isNull);
});
+ test('calling dispose() on disposed controller does not throw', () async {
+ final VideoPlayerController controller = VideoPlayerController.network(
+ 'https://127.0.0.1',
+ );
+
+ await controller.initialize();
+ await controller.dispose();
+
+ expect(() async => await controller.dispose(), returnsNormally);
+ });
+
test('play', () async {
final VideoPlayerController controller = VideoPlayerController.network(
'https://127.0.0.1',