[camera] Fix a disposed camera controller throwing an exception when being replaced in the preview widget. (#4272)
diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md
index bb00480..5a3a1bf 100644
--- a/packages/camera/camera/CHANGELOG.md
+++ b/packages/camera/camera/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.9.2+1
+
+* Fixed camera controller throwing an exception when being replaced in the preview widget.
+
## 0.9.2
* Added functions to pause and resume the camera preview.
diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart
index 364f59d..a806700 100644
--- a/packages/camera/camera/example/lib/main.dart
+++ b/packages/camera/camera/example/lib/main.dart
@@ -603,7 +603,9 @@
}
void onNewCameraSelected(CameraDescription cameraDescription) async {
- final previousCameraController = controller;
+ if (controller != null) {
+ await controller!.dispose();
+ }
final CameraController cameraController = CameraController(
cameraDescription,
@@ -614,10 +616,6 @@
controller = cameraController;
- if (mounted) {
- setState(() {});
- }
-
// If the controller is updated then update the UI.
cameraController.addListener(() {
if (mounted) setState(() {});
@@ -650,8 +648,6 @@
if (mounted) {
setState(() {});
}
-
- await previousCameraController?.dispose();
}
void onTakePictureButtonPressed() {
diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart
index 58193bd..f21a3b1 100644
--- a/packages/camera/camera/lib/src/camera_controller.dart
+++ b/packages/camera/camera/lib/src/camera_controller.dart
@@ -824,4 +824,14 @@
);
}
}
+
+ @override
+ void removeListener(VoidCallback listener) {
+ // Prevent ValueListenableBuilder in CameraPreview widget from causing an
+ // exception to be thrown by attempting to remove its own listener after
+ // the controller has already been disposed.
+ if (!_isDisposed) {
+ super.removeListener(listener);
+ }
+ }
}
diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml
index 3e3fad1..400b8c0 100644
--- a/packages/camera/camera/pubspec.yaml
+++ b/packages/camera/camera/pubspec.yaml
@@ -4,7 +4,7 @@
and streaming image buffers to dart.
repository: https://github.com/flutter/plugins/tree/master/packages/camera/camera
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.9.2
+version: 0.9.2+1
environment:
sdk: ">=2.12.0 <3.0.0"