[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"