Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 6594de8

Browse files
committed
Fix disposed exceptions for the camera example
1 parent f48198e commit 6594de8

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

packages/camera/camera/example/integration_test/camera_test.dart

+30-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44

55
import 'dart:async';
66
import 'dart:io';
7-
import 'dart:ui';
7+
import 'dart:ui' as ui;
88

99
import 'package:camera/camera.dart';
10-
import 'package:flutter/painting.dart';
10+
import 'package:camera_example/main.dart';
11+
import 'package:flutter/material.dart';
1112
import 'package:flutter_test/flutter_test.dart';
1213
import 'package:path_provider/path_provider.dart';
1314
import 'package:video_player/video_player.dart';
@@ -63,7 +64,9 @@ void main() {
6364

6465
// Load picture
6566
final File fileImage = File(file.path);
66-
final Image image = await decodeImageFromList(fileImage.readAsBytesSync());
67+
final ui.Image image = await decodeImageFromList(
68+
fileImage.readAsBytesSync(),
69+
);
6770

6871
// Verify image dimensions are as expected
6972
expect(image, isNotNull);
@@ -240,4 +243,28 @@ void main() {
240243
},
241244
skip: !Platform.isAndroid,
242245
);
246+
247+
testWidgets(
248+
'Disposed controller removed correctly',
249+
(WidgetTester tester) async {
250+
cameras = await availableCameras();
251+
if (cameras.isEmpty) {
252+
return;
253+
}
254+
255+
// Bump the example.
256+
await tester.pumpWidget(CameraApp());
257+
await tester.pumpAndSettle(const Duration(seconds: 3));
258+
259+
// Tap to switch to the first camera.
260+
await tester.tap(
261+
find.byIcon(getCameraLensIcon(cameras.first.lensDirection)),
262+
);
263+
// Wait a few seconds to make sure the lifecycle changed.
264+
await tester.pumpAndSettle(const Duration(seconds: 3));
265+
// Ensure the controller is no longer depended by widgets.
266+
final dynamic exception = tester.takeException();
267+
expect(exception, isNull);
268+
},
269+
);
243270
}

packages/camera/camera/example/lib/main.dart

+7-3
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,12 @@ class _CameraExampleHomeState extends State<CameraExampleHome>
626626

627627
void onNewCameraSelected(CameraDescription cameraDescription) async {
628628
if (controller != null) {
629-
await controller!.dispose();
629+
CameraController? _controller = controller!;
630+
setState(() {
631+
controller = null;
632+
});
633+
await _controller.dispose();
634+
_controller = null;
630635
}
631636

632637
final CameraController cameraController = CameraController(
@@ -636,8 +641,6 @@ class _CameraExampleHomeState extends State<CameraExampleHome>
636641
imageFormatGroup: ImageFormatGroup.jpeg,
637642
);
638643

639-
controller = cameraController;
640-
641644
// If the controller is updated then update the UI.
642645
cameraController.addListener(() {
643646
if (mounted) setState(() {});
@@ -668,6 +671,7 @@ class _CameraExampleHomeState extends State<CameraExampleHome>
668671
.getMinZoomLevel()
669672
.then((value) => _minAvailableZoom = value),
670673
]);
674+
controller = cameraController;
671675
} on CameraException catch (e) {
672676
_showCameraException(e);
673677
}

0 commit comments

Comments
 (0)