Julian Steenbakker

bug: fix pause and resume not working on web

@@ -13,6 +13,17 @@ import 'package:web/web.dart'; @@ -13,6 +13,17 @@ import 'package:web/web.dart';
13 abstract class BarcodeReader { 13 abstract class BarcodeReader {
14 const BarcodeReader(); 14 const BarcodeReader();
15 15
  16 + /// Whether the video feed is paused
  17 + bool? get paused =>
  18 + throw UnimplementedError('paused has not been implemented.');
  19 +
  20 + /// Pause the barcode reader.
  21 + void pause() => throw UnimplementedError('pause() has not been implemented.');
  22 +
  23 + /// Pause the barcode reader.
  24 + Future<void> resume() =>
  25 + throw UnimplementedError('resume() has not been implemented.');
  26 +
16 /// Whether the scanner is currently scanning for barcodes. 27 /// Whether the scanner is currently scanning for barcodes.
17 bool get isScanning { 28 bool get isScanning {
18 throw UnimplementedError('isScanning has not been implemented.'); 29 throw UnimplementedError('isScanning has not been implemented.');
@@ -128,11 +139,6 @@ abstract class BarcodeReader { @@ -128,11 +139,6 @@ abstract class BarcodeReader {
128 throw UnimplementedError('start() has not been implemented.'); 139 throw UnimplementedError('start() has not been implemented.');
129 } 140 }
130 141
131 - /// Pause the barcode reader.  
132 - Future<void> pause() {  
133 - throw UnimplementedError('pause() has not been implemented.');  
134 - }  
135 -  
136 /// Stop the barcode reader and dispose of the video stream. 142 /// Stop the barcode reader and dispose of the video stream.
137 Future<void> stop() { 143 Future<void> stop() {
138 throw UnimplementedError('stop() has not been implemented.'); 144 throw UnimplementedError('stop() has not been implemented.');
@@ -263,6 +263,16 @@ class MobileScannerWeb extends MobileScannerPlatform { @@ -263,6 +263,16 @@ class MobileScannerWeb extends MobileScannerPlatform {
263 @override 263 @override
264 Future<MobileScannerViewAttributes> start(StartOptions startOptions) async { 264 Future<MobileScannerViewAttributes> start(StartOptions startOptions) async {
265 if (_barcodeReader != null) { 265 if (_barcodeReader != null) {
  266 + if (_barcodeReader!.paused ?? false) {
  267 + await _barcodeReader?.resume();
  268 + return MobileScannerViewAttributes(
  269 + // The torch of a media stream is not available for video tracks.
  270 + // See https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints#instance_properties_of_video_tracks
  271 + currentTorchMode: TorchState.unavailable,
  272 + size: _barcodeReader?.videoSize ?? Size.zero,
  273 + );
  274 + }
  275 +
266 throw const MobileScannerException( 276 throw const MobileScannerException(
267 errorCode: MobileScannerErrorCode.controllerAlreadyInitialized, 277 errorCode: MobileScannerErrorCode.controllerAlreadyInitialized,
268 errorDetails: MobileScannerErrorDetails( 278 errorDetails: MobileScannerErrorDetails(
@@ -365,7 +375,7 @@ class MobileScannerWeb extends MobileScannerPlatform { @@ -365,7 +375,7 @@ class MobileScannerWeb extends MobileScannerPlatform {
365 @override 375 @override
366 Future<void> pause() async { 376 Future<void> pause() async {
367 _barcodesSubscription?.pause(); 377 _barcodesSubscription?.pause();
368 - await _barcodeReader?.pause(); 378 + _barcodeReader?.pause();
369 } 379 }
370 380
371 @override 381 @override
@@ -169,8 +169,15 @@ final class ZXingBarcodeReader extends BarcodeReader { @@ -169,8 +169,15 @@ final class ZXingBarcodeReader extends BarcodeReader {
169 } 169 }
170 170
171 @override 171 @override
172 - Future<void> pause() async {  
173 - _reader?.videoElement?.pause(); 172 + bool? get paused => _reader?.videoElement?.paused;
  173 +
  174 + @override
  175 + void pause() => _reader?.videoElement?.pause();
  176 +
  177 + @override
  178 + Future<void> resume() async {
  179 + final result = _reader?.videoElement?.play();
  180 + await result?.toDart;
174 } 181 }
175 182
176 @override 183 @override