scan products

This commit is contained in:
Mikkel Troels Kongsted 2025-02-11 12:56:52 +01:00
parent 8f4ca01f77
commit 385d962092
5 changed files with 112 additions and 2 deletions

View File

@ -42,4 +42,5 @@
<data android:mimeType="text/plain"/>
</intent>
</queries>
<uses-permission android:name="android.permission.CAMERA"/>
</manifest>

View File

@ -1,6 +1,11 @@
import 'package:barcode_scan2/model/android_options.dart';
import 'package:barcode_scan2/model/scan_options.dart';
import 'package:barcode_scan2/platform_wrapper.dart';
import 'package:flutter/material.dart';
import 'package:mobile/pages/finish_shopping_page.dart';
import 'package:mobile/repos/cart.dart';
import 'package:mobile/repos/product.dart';
import 'package:mobile/results.dart';
import 'package:mobile/widgets/primary_button.dart';
import 'package:mobile/widgets/primary_card.dart';
import 'package:provider/provider.dart';
@ -181,7 +186,68 @@ class CartPage extends StatelessWidget {
child: Container(
margin: const EdgeInsets.only(left: 10),
child: PrimaryButton(
onPressed: () {}, child: const Text("Skan vare")),
onPressed: () async {
final result = await BarcodeScanner.scan(
options: const ScanOptions(
android: AndroidOptions(
appBarTitle: "Skan varer"),
strings: {
"cancel": "Annullér",
"flash_on": "Lommelygte til",
"flash_off": "Lommelygte fra"
}));
switch (result.type.name) {
case "Cancelled":
final snackBar = const SnackBar(
content:
Text("Skanning af varer annulleret"));
if (context.mounted) {
ScaffoldMessenger.of(context)
.showSnackBar(snackBar);
}
case "Barcode":
if (!context.mounted) {
return;
}
final CartRepo cartRepo =
context.read<CartRepo>();
final ProductRepo productRepo =
context.read<ProductRepo>();
final productResult = productRepo
.productWithBarcode(result.rawContent);
switch (productResult) {
case Ok<Product, String>():
{
cartRepo.addToCart(productResult.value);
final snackBar = SnackBar(
content: Text(
"Tilføjet ${productResult.value.name} til indkøbskurven"));
ScaffoldMessenger.of(context)
.showSnackBar(snackBar);
}
case Err<Product, String>():
final snackBar = const SnackBar(
content: Text(
"Varen du prøver at tilføje eksistere ikke"));
ScaffoldMessenger.of(context)
.showSnackBar(snackBar);
}
case "Error":
if (!context.mounted) {
return;
}
final snackBar = const SnackBar(
content:
Text("Der skete en fejl, prøv igen"));
ScaffoldMessenger.of(context)
.showSnackBar(snackBar);
default:
throw Exception("Unreachable");
}
},
child: const Text("Skan vare")),
),
),
],

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:mobile/results.dart';
class ProductRepo extends ChangeNotifier {
int _nextId = 0;
@ -33,6 +34,15 @@ class ProductRepo extends ChangeNotifier {
notifyListeners();
}
Result<Product, String> productWithBarcode(String barcode) {
for (var i = 0; i < products.length; i++) {
if (products[i].barcode == barcode) {
return Ok(products[i]);
}
}
return Err("Product with barcode $barcode doesn't exist");
}
void _addAllProducts() {
products = [
Product(
@ -76,6 +86,12 @@ class ProductRepo extends ChangeNotifier {
name: "Jägermeister 750 ml",
price: 60,
description: ""),
Product(
id: _nextId++,
barcode: "5711953068881",
name: "Protein Chokoladedrik",
price: 15,
description: "Arla's protein chokolade drik der giver store muskler"),
];
}
}
@ -93,11 +109,13 @@ class Product {
final String description;
final int price;
final Coordinate? location;
final String? barcode;
Product(
{required this.id,
required this.name,
required this.price,
required this.description,
this.location});
this.location,
this.barcode});
}

View File

@ -9,6 +9,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.11.0"
barcode_scan2:
dependency: "direct main"
description:
name: barcode_scan2
sha256: ee34fad7148248f4450652909f5188ad95c9b6f512e75088e96bc3e96ff2e9eb
url: "https://pub.dev"
source: hosted
version: "4.4.0"
boolean_selector:
dependency: transitive
description:
@ -57,6 +65,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
fixnum:
dependency: transitive
description:
name: fixnum
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
url: "https://pub.dev"
source: hosted
version: "1.1.1"
flutter:
dependency: "direct main"
description: flutter
@ -147,6 +163,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.0"
protobuf:
dependency: transitive
description:
name: protobuf
sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
provider:
dependency: "direct main"
description:

View File

@ -35,6 +35,7 @@ dependencies:
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8
provider: ^6.1.2
barcode_scan2: ^4.4.0
dev_dependencies:
flutter_test: