Sander Roest

Working, but bad recognition in landscape.

... ... @@ -12,8 +12,6 @@ import 'package:mobile_scanner_example/mobile_scanner_overlay.dart';
import 'package:mobile_scanner_example/picklist/picklist_result.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
runApp(
const MaterialApp(
title: 'Mobile Scanner Example',
... ...
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import 'package:mobile_scanner_example/picklist/classes/detect_collision.dart';
import 'package:mobile_scanner_example/picklist/classes/barcode_at_center.dart';
import 'package:mobile_scanner_example/picklist/widgets/crosshair.dart';
import 'package:mobile_scanner_example/scanner_error_widget.dart';
... ... @@ -21,13 +21,12 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist>
);
StreamSubscription<Object?>? _barcodesSubscription;
final _scannerDisabled = ValueNotifier(false);
final _scannerEnabled = ValueNotifier(true);
bool barcodeDetected = false;
@override
void initState() {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
WidgetsBinding.instance.addObserver(this);
_barcodesSubscription = _mobileScannerController.barcodes.listen(
_handleBarcodes,
... ... @@ -69,17 +68,14 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist>
}
void _handleBarcodes(BarcodeCapture capture) {
if (_scannerDisabled.value) {
if (!_scannerEnabled.value) {
return;
}
for (final barcode in capture.barcodes) {
if (isPointInPolygon(
Offset(
_mobileScannerController.value.size.width / 2,
_mobileScannerController.value.size.height / 2,
),
barcode.corners,
if (isBarcodeAtCenterOfImage(
cameraOutputSize: _mobileScannerController.value.size,
barcode: barcode,
)) {
if (!barcodeDetected) {
barcodeDetected = true;
... ... @@ -92,14 +88,7 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist>
@override
Widget build(BuildContext context) {
const boxFit = BoxFit.contain;
return PopScope(
onPopInvokedWithResult: (didPop, result) {
if (didPop) {
SystemChrome.setPreferredOrientations([...DeviceOrientation.values]);
}
},
child: Scaffold(
return Scaffold(
appBar: AppBar(title: const Text('Picklist scanner')),
backgroundColor: Colors.black,
body: StreamBuilder(
... ... @@ -107,9 +96,9 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist>
builder: (context, snapshot) {
return Listener(
behavior: HitTestBehavior.opaque,
onPointerDown: (_) => _scannerDisabled.value = true,
onPointerUp: (_) => _scannerDisabled.value = false,
onPointerCancel: (_) => _scannerDisabled.value = false,
onPointerDown: (_) => _scannerEnabled.value = false,
onPointerUp: (_) => _scannerEnabled.value = true,
onPointerCancel: (_) => _scannerEnabled.value = true,
child: Stack(
fit: StackFit.expand,
children: [
... ... @@ -117,13 +106,13 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist>
controller: _mobileScannerController,
errorBuilder: (context, error, child) =>
ScannerErrorWidget(error: error),
fit: boxFit,
fit: BoxFit.contain,
),
ValueListenableBuilder(
valueListenable: _scannerDisabled,
valueListenable: _scannerEnabled,
builder: (context, value, child) {
return Crosshair(
scannerDisabled: value,
scannerEnabled: value,
);
},
),
... ... @@ -132,7 +121,6 @@ class _BarcodeScannerPicklistState extends State<BarcodeScannerPicklist>
);
},
),
),
);
}
}
... ...
import 'package:flutter/material.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
bool isPointInPolygon(Offset point, List<Offset> polygon) {
bool isBarcodeAtCenterOfImage({
required Size cameraOutputSize,
required Barcode barcode,
}) {
final centerOfCameraOutput = Offset(
cameraOutputSize.width / 2,
cameraOutputSize.height / 2,
);
debugPrint(cameraOutputSize.toString());
return _isPointInPolygon(
point: centerOfCameraOutput,
polygon: barcode.corners,
);
}
//This is what chatGPT came up with.
//https://en.wikipedia.org/wiki/Point_in_polygon
bool _isPointInPolygon({
required Offset point,
required List<Offset> polygon,
}) {
int i;
int j = polygon.length - 1;
bool inside = false;
... ...
... ... @@ -3,17 +3,17 @@ import 'package:flutter/material.dart';
class Crosshair extends StatelessWidget {
const Crosshair({
super.key,
required this.scannerDisabled,
required this.scannerEnabled,
});
final bool scannerDisabled;
final bool scannerEnabled;
@override
Widget build(BuildContext context) {
return Center(
child: Icon(
Icons.close,
color: scannerDisabled ? Colors.green : Colors.red,
color: scannerEnabled ? Colors.red : Colors.green,
),
);
}
... ...