Showing
4 changed files
with
64 additions
and
57 deletions
| @@ -12,8 +12,6 @@ import 'package:mobile_scanner_example/mobile_scanner_overlay.dart'; | @@ -12,8 +12,6 @@ import 'package:mobile_scanner_example/mobile_scanner_overlay.dart'; | ||
| 12 | import 'package:mobile_scanner_example/picklist/picklist_result.dart'; | 12 | import 'package:mobile_scanner_example/picklist/picklist_result.dart'; |
| 13 | 13 | ||
| 14 | void main() async { | 14 | void main() async { |
| 15 | - WidgetsFlutterBinding.ensureInitialized(); | ||
| 16 | - await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); | ||
| 17 | runApp( | 15 | runApp( |
| 18 | const MaterialApp( | 16 | const MaterialApp( |
| 19 | title: 'Mobile Scanner Example', | 17 | title: 'Mobile Scanner Example', |
| 1 | import 'dart:async'; | 1 | import 'dart:async'; |
| 2 | 2 | ||
| 3 | import 'package:flutter/material.dart'; | 3 | import 'package:flutter/material.dart'; |
| 4 | -import 'package:flutter/services.dart'; | ||
| 5 | import 'package:mobile_scanner/mobile_scanner.dart'; | 4 | import 'package:mobile_scanner/mobile_scanner.dart'; |
| 6 | -import 'package:mobile_scanner_example/picklist/classes/detect_collision.dart'; | 5 | +import 'package:mobile_scanner_example/picklist/classes/barcode_at_center.dart'; |
| 6 | + | ||
| 7 | import 'package:mobile_scanner_example/picklist/widgets/crosshair.dart'; | 7 | import 'package:mobile_scanner_example/picklist/widgets/crosshair.dart'; |
| 8 | import 'package:mobile_scanner_example/scanner_error_widget.dart'; | 8 | import 'package:mobile_scanner_example/scanner_error_widget.dart'; |
| 9 | 9 | ||
| @@ -21,13 +21,12 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist> | @@ -21,13 +21,12 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist> | ||
| 21 | ); | 21 | ); |
| 22 | StreamSubscription<Object?>? _barcodesSubscription; | 22 | StreamSubscription<Object?>? _barcodesSubscription; |
| 23 | 23 | ||
| 24 | - final _scannerDisabled = ValueNotifier(false); | 24 | + final _scannerEnabled = ValueNotifier(true); |
| 25 | 25 | ||
| 26 | bool barcodeDetected = false; | 26 | bool barcodeDetected = false; |
| 27 | 27 | ||
| 28 | @override | 28 | @override |
| 29 | void initState() { | 29 | void initState() { |
| 30 | - SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); | ||
| 31 | WidgetsBinding.instance.addObserver(this); | 30 | WidgetsBinding.instance.addObserver(this); |
| 32 | _barcodesSubscription = _mobileScannerController.barcodes.listen( | 31 | _barcodesSubscription = _mobileScannerController.barcodes.listen( |
| 33 | _handleBarcodes, | 32 | _handleBarcodes, |
| @@ -69,17 +68,14 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist> | @@ -69,17 +68,14 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist> | ||
| 69 | } | 68 | } |
| 70 | 69 | ||
| 71 | void _handleBarcodes(BarcodeCapture capture) { | 70 | void _handleBarcodes(BarcodeCapture capture) { |
| 72 | - if (_scannerDisabled.value) { | 71 | + if (!_scannerEnabled.value) { |
| 73 | return; | 72 | return; |
| 74 | } | 73 | } |
| 75 | 74 | ||
| 76 | for (final barcode in capture.barcodes) { | 75 | for (final barcode in capture.barcodes) { |
| 77 | - if (isPointInPolygon( | ||
| 78 | - Offset( | ||
| 79 | - _mobileScannerController.value.size.width / 2, | ||
| 80 | - _mobileScannerController.value.size.height / 2, | ||
| 81 | - ), | ||
| 82 | - barcode.corners, | 76 | + if (isBarcodeAtCenterOfImage( |
| 77 | + cameraOutputSize: _mobileScannerController.value.size, | ||
| 78 | + barcode: barcode, | ||
| 83 | )) { | 79 | )) { |
| 84 | if (!barcodeDetected) { | 80 | if (!barcodeDetected) { |
| 85 | barcodeDetected = true; | 81 | barcodeDetected = true; |
| @@ -92,46 +88,38 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist> | @@ -92,46 +88,38 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist> | ||
| 92 | 88 | ||
| 93 | @override | 89 | @override |
| 94 | Widget build(BuildContext context) { | 90 | Widget build(BuildContext context) { |
| 95 | - const boxFit = BoxFit.contain; | ||
| 96 | - return PopScope( | ||
| 97 | - onPopInvokedWithResult: (didPop, result) { | ||
| 98 | - if (didPop) { | ||
| 99 | - SystemChrome.setPreferredOrientations([...DeviceOrientation.values]); | ||
| 100 | - } | ||
| 101 | - }, | ||
| 102 | - child: Scaffold( | ||
| 103 | - appBar: AppBar(title: const Text('Picklist scanner')), | ||
| 104 | - backgroundColor: Colors.black, | ||
| 105 | - body: StreamBuilder( | ||
| 106 | - stream: _mobileScannerController.barcodes, | ||
| 107 | - builder: (context, snapshot) { | ||
| 108 | - return Listener( | ||
| 109 | - behavior: HitTestBehavior.opaque, | ||
| 110 | - onPointerDown: (_) => _scannerDisabled.value = true, | ||
| 111 | - onPointerUp: (_) => _scannerDisabled.value = false, | ||
| 112 | - onPointerCancel: (_) => _scannerDisabled.value = false, | ||
| 113 | - child: Stack( | ||
| 114 | - fit: StackFit.expand, | ||
| 115 | - children: [ | ||
| 116 | - MobileScanner( | ||
| 117 | - controller: _mobileScannerController, | ||
| 118 | - errorBuilder: (context, error, child) => | ||
| 119 | - ScannerErrorWidget(error: error), | ||
| 120 | - fit: boxFit, | ||
| 121 | - ), | ||
| 122 | - ValueListenableBuilder( | ||
| 123 | - valueListenable: _scannerDisabled, | ||
| 124 | - builder: (context, value, child) { | ||
| 125 | - return Crosshair( | ||
| 126 | - scannerDisabled: value, | ||
| 127 | - ); | ||
| 128 | - }, | ||
| 129 | - ), | ||
| 130 | - ], | ||
| 131 | - ), | ||
| 132 | - ); | ||
| 133 | - }, | ||
| 134 | - ), | 91 | + return Scaffold( |
| 92 | + appBar: AppBar(title: const Text('Picklist scanner')), | ||
| 93 | + backgroundColor: Colors.black, | ||
| 94 | + body: StreamBuilder( | ||
| 95 | + stream: _mobileScannerController.barcodes, | ||
| 96 | + builder: (context, snapshot) { | ||
| 97 | + return Listener( | ||
| 98 | + behavior: HitTestBehavior.opaque, | ||
| 99 | + onPointerDown: (_) => _scannerEnabled.value = false, | ||
| 100 | + onPointerUp: (_) => _scannerEnabled.value = true, | ||
| 101 | + onPointerCancel: (_) => _scannerEnabled.value = true, | ||
| 102 | + child: Stack( | ||
| 103 | + fit: StackFit.expand, | ||
| 104 | + children: [ | ||
| 105 | + MobileScanner( | ||
| 106 | + controller: _mobileScannerController, | ||
| 107 | + errorBuilder: (context, error, child) => | ||
| 108 | + ScannerErrorWidget(error: error), | ||
| 109 | + fit: BoxFit.contain, | ||
| 110 | + ), | ||
| 111 | + ValueListenableBuilder( | ||
| 112 | + valueListenable: _scannerEnabled, | ||
| 113 | + builder: (context, value, child) { | ||
| 114 | + return Crosshair( | ||
| 115 | + scannerEnabled: value, | ||
| 116 | + ); | ||
| 117 | + }, | ||
| 118 | + ), | ||
| 119 | + ], | ||
| 120 | + ), | ||
| 121 | + ); | ||
| 122 | + }, | ||
| 135 | ), | 123 | ), |
| 136 | ); | 124 | ); |
| 137 | } | 125 | } |
| 1 | import 'package:flutter/material.dart'; | 1 | import 'package:flutter/material.dart'; |
| 2 | +import 'package:mobile_scanner/mobile_scanner.dart'; | ||
| 2 | 3 | ||
| 3 | -bool isPointInPolygon(Offset point, List<Offset> polygon) { | 4 | +bool isBarcodeAtCenterOfImage({ |
| 5 | + required Size cameraOutputSize, | ||
| 6 | + required Barcode barcode, | ||
| 7 | +}) { | ||
| 8 | + final centerOfCameraOutput = Offset( | ||
| 9 | + cameraOutputSize.width / 2, | ||
| 10 | + cameraOutputSize.height / 2, | ||
| 11 | + ); | ||
| 12 | + debugPrint(cameraOutputSize.toString()); | ||
| 13 | + return _isPointInPolygon( | ||
| 14 | + point: centerOfCameraOutput, | ||
| 15 | + polygon: barcode.corners, | ||
| 16 | + ); | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +//This is what chatGPT came up with. | ||
| 20 | +//https://en.wikipedia.org/wiki/Point_in_polygon | ||
| 21 | +bool _isPointInPolygon({ | ||
| 22 | + required Offset point, | ||
| 23 | + required List<Offset> polygon, | ||
| 24 | +}) { | ||
| 4 | int i; | 25 | int i; |
| 5 | int j = polygon.length - 1; | 26 | int j = polygon.length - 1; |
| 6 | bool inside = false; | 27 | bool inside = false; |
| @@ -3,17 +3,17 @@ import 'package:flutter/material.dart'; | @@ -3,17 +3,17 @@ import 'package:flutter/material.dart'; | ||
| 3 | class Crosshair extends StatelessWidget { | 3 | class Crosshair extends StatelessWidget { |
| 4 | const Crosshair({ | 4 | const Crosshair({ |
| 5 | super.key, | 5 | super.key, |
| 6 | - required this.scannerDisabled, | 6 | + required this.scannerEnabled, |
| 7 | }); | 7 | }); |
| 8 | 8 | ||
| 9 | - final bool scannerDisabled; | 9 | + final bool scannerEnabled; |
| 10 | 10 | ||
| 11 | @override | 11 | @override |
| 12 | Widget build(BuildContext context) { | 12 | Widget build(BuildContext context) { |
| 13 | return Center( | 13 | return Center( |
| 14 | child: Icon( | 14 | child: Icon( |
| 15 | Icons.close, | 15 | Icons.close, |
| 16 | - color: scannerDisabled ? Colors.green : Colors.red, | 16 | + color: scannerEnabled ? Colors.red : Colors.green, |
| 17 | ), | 17 | ), |
| 18 | ); | 18 | ); |
| 19 | } | 19 | } |
-
Please register or login to post a comment