1+ import 'dart:async' ;
2+
13import 'package:flutter/material.dart' ;
24import 'package:mobile_scanner/mobile_scanner.dart' ;
3- import 'package:torch_light/torch_light.dart' ;
45
56class CustomScannerController {
6- CustomScannerController ({required MobileScannerController controller})
7- : _controller = controller,
8- _torchState = TorchState (),
7+ CustomScannerController (this ._controller)
8+ : _torchState = ScannerTorchState (),
99 _availableCamerasState = AvailableCamerasState (),
10- _cameraFacingState = CameraFacingState () {
11- _detectTorch ();
12- }
10+ _cameraFacingState = CameraFacingState ();
1311
1412 final MobileScannerController _controller;
15- final TorchState _torchState;
13+ final ScannerTorchState _torchState;
1614 final AvailableCamerasState _availableCamerasState;
1715 final CameraFacingState _cameraFacingState;
1816
@@ -43,9 +41,17 @@ class CustomScannerController {
4341 } catch (_) {}
4442 }
4543
44+ void onPause () {
45+ _isStarted = false ;
46+ _isStarting = false ;
47+ _isClosing = false ;
48+ _isClosed = false ;
49+ }
50+
4651 void _onControllerChanged () {
4752 _availableCamerasState.value = _controller.value.availableCameras ?? 0 ;
4853 _cameraFacingState.value = _controller.facing;
54+ _torchState.value = _controller.value.torchState;
4955 }
5056
5157 MobileScannerController get controller => _controller;
@@ -74,21 +80,20 @@ class CustomScannerController {
7480
7581 bool get hasTorch => _torchState.value != null ;
7682
77- ValueNotifier <bool ?> get hasTorchState => _torchState;
83+ ValueNotifier <TorchState ?> get hasTorchState => _torchState;
7884
79- bool get isTorchOn => _torchState.value == true ;
85+ // ugly
86+ bool get isTorchOn => _torchState.value == TorchState .on ;
8087
8188 void turnTorchOff () {
8289 if (isTorchOn) {
83- _controller.toggleTorch ();
84- _torchState.value = false ;
90+ unawaited (_controller.toggleTorch ());
8591 }
8692 }
8793
8894 void turnTorchOn () {
8995 if (! isTorchOn) {
90- _controller.toggleTorch ();
91- _torchState.value = true ;
96+ unawaited (_controller.toggleTorch ());
9297 }
9398 }
9499
@@ -101,6 +106,7 @@ class CustomScannerController {
101106 }
102107
103108 ValueNotifier <int > get availableCameras => _availableCamerasState;
109+
104110 ValueNotifier <CameraFacing > get cameraFacing => _cameraFacingState;
105111
106112 void toggleCamera () {
@@ -109,27 +115,16 @@ class CustomScannerController {
109115 _torchState.value = null ;
110116 _cameraFacingState.value = CameraFacing .front;
111117 } else if (_controller.facing == CameraFacing .front) {
112- _torchState.value = false ;
118+ _torchState.value = TorchState .off ;
113119 _cameraFacingState.value = CameraFacing .back;
114120 }
115121 }
116122
117- Future <void > _detectTorch () async {
118- try {
119- final bool isTorchAvailable = await TorchLight .isTorchAvailable ();
120- if (isTorchAvailable) {
121- _torchState.value = false ;
122- } else {
123- _torchState.value = null ;
124- }
125- } on Exception catch (_) {}
126- }
127-
128123 Future <void > dispose () => _controller.dispose ();
129124}
130125
131- class TorchState extends ValueNotifier <bool ?> {
132- TorchState ({ bool ? value}) : super (value);
126+ class ScannerTorchState extends ValueNotifier <TorchState ?> {
127+ ScannerTorchState ({ TorchState ? value}) : super (value);
133128}
134129
135130class AvailableCamerasState extends ValueNotifier <int > {
0 commit comments