diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index bb0048036f58..5a3a1bf251d7 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 364f59d81356..a8067001aae5 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -603,7 +603,9 @@ class _CameraExampleHomeState extends State } void onNewCameraSelected(CameraDescription cameraDescription) async { - final previousCameraController = controller; + if (controller != null) { + await controller!.dispose(); + } final CameraController cameraController = CameraController( cameraDescription, @@ -614,10 +616,6 @@ class _CameraExampleHomeState extends State controller = cameraController; - if (mounted) { - setState(() {}); - } - // If the controller is updated then update the UI. cameraController.addListener(() { if (mounted) setState(() {}); @@ -650,8 +648,6 @@ class _CameraExampleHomeState extends State 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 58193bd204c4..f21a3b12c81f 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -824,4 +824,14 @@ class CameraController extends ValueNotifier { ); } } + + @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 3e3fad15051b..400b8c03f44a 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,7 +4,7 @@ description: A Flutter plugin for getting information about and controlling the 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"