Skip to content

Commit 87769d2

Browse files
barcode scanner for mobile/web and window
1 parent 5734ef9 commit 87769d2

19 files changed

+463
-93
lines changed

example/android/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ android {
4747
applicationId "com.kharagedition.example"
4848
// You can update the following values to match your application needs.
4949
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
50-
minSdkVersion flutter.minSdkVersion
50+
minSdkVersion 19
5151
targetSdkVersion flutter.targetSdkVersion
5252
versionCode flutterVersionCode.toInteger()
5353
versionName flutterVersionName

example/android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="com.kharagedition.example">
3+
<uses-permission android:name="android.permission.CAMERA" />
34
<application
45
android:label="example"
56
android:name="${applicationName}"

example/lib/main.dart

Lines changed: 25 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import 'package:flutter/material.dart';
2+
import 'package:simple_barcode_scanner/simple_barcode_scanner.dart';
3+
import 'package:webview_flutter/webview_flutter.dart';
24

35
void main() {
46
runApp(const MyApp());
@@ -13,103 +15,47 @@ class MyApp extends StatelessWidget {
1315
return MaterialApp(
1416
title: 'Flutter Demo',
1517
theme: ThemeData(
16-
// This is the theme of your application.
17-
//
18-
// Try running your application with "flutter run". You'll see the
19-
// application has a blue toolbar. Then, without quitting the app, try
20-
// changing the primarySwatch below to Colors.green and then invoke
21-
// "hot reload" (press "r" in the console where you ran "flutter run",
22-
// or simply save your changes to "hot reload" in a Flutter IDE).
23-
// Notice that the counter didn't reset back to zero; the application
24-
// is not restarted.
2518
primarySwatch: Colors.blue,
2619
),
27-
home: const MyHomePage(title: 'Flutter Demo Home Page'),
20+
home: const HomePage(),
2821
);
2922
}
3023
}
3124

32-
class MyHomePage extends StatefulWidget {
33-
const MyHomePage({Key? key, required this.title}) : super(key: key);
34-
35-
// This widget is the home page of your application. It is stateful, meaning
36-
// that it has a State object (defined below) that contains fields that affect
37-
// how it looks.
38-
39-
// This class is the configuration for the state. It holds the values (in this
40-
// case the title) provided by the parent (in this case the App widget) and
41-
// used by the build method of the State. Fields in a Widget subclass are
42-
// always marked "final".
43-
44-
final String title;
25+
class HomePage extends StatefulWidget {
26+
const HomePage({Key? key}) : super(key: key);
4527

4628
@override
47-
State<MyHomePage> createState() => _MyHomePageState();
29+
State<HomePage> createState() => _HomePageState();
4830
}
4931

50-
class _MyHomePageState extends State<MyHomePage> {
51-
int _counter = 0;
52-
53-
void _incrementCounter() {
54-
setState(() {
55-
// This call to setState tells the Flutter framework that something has
56-
// changed in this State, which causes it to rerun the build method below
57-
// so that the display can reflect the updated values. If we changed
58-
// _counter without calling setState(), then the build method would not be
59-
// called again, and so nothing would appear to happen.
60-
_counter++;
61-
});
62-
}
63-
32+
class _HomePageState extends State<HomePage> {
33+
String result = '';
6434
@override
6535
Widget build(BuildContext context) {
66-
// This method is rerun every time setState is called, for instance as done
67-
// by the _incrementCounter method above.
68-
//
69-
// The Flutter framework has been optimized to make rerunning build methods
70-
// fast, so that you can just rebuild anything that needs updating rather
71-
// than having to individually change instances of widgets.
7236
return Scaffold(
73-
appBar: AppBar(
74-
// Here we take the value from the MyHomePage object that was created by
75-
// the App.build method, and use it to set our appbar title.
76-
title: Text(widget.title),
77-
),
7837
body: Center(
79-
// Center is a layout widget. It takes a single child and positions it
80-
// in the middle of the parent.
8138
child: Column(
82-
// Column is also a layout widget. It takes a list of children and
83-
// arranges them vertically. By default, it sizes itself to fit its
84-
// children horizontally, and tries to be as tall as its parent.
85-
//
86-
// Invoke "debug painting" (press "p" in the console, choose the
87-
// "Toggle Debug Paint" action from the Flutter Inspector in Android
88-
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
89-
// to see the wireframe for each widget.
90-
//
91-
// Column has various properties to control how it sizes itself and
92-
// how it positions its children. Here we use mainAxisAlignment to
93-
// center the children vertically; the main axis here is the vertical
94-
// axis because Columns are vertical (the cross axis would be
95-
// horizontal).
96-
mainAxisAlignment: MainAxisAlignment.center,
97-
children: <Widget>[
98-
const Text(
99-
'You have pushed the button this many times:',
100-
),
101-
Text(
102-
'$_counter',
103-
style: Theme.of(context).textTheme.headline4,
104-
),
39+
mainAxisSize: MainAxisSize.min,
40+
children: [
41+
ElevatedButton(
42+
onPressed: () async {
43+
var res = await Navigator.push(
44+
context,
45+
MaterialPageRoute(
46+
builder: (context) => const SimpleBarcodeScannerPage(),
47+
));
48+
setState(() {
49+
if (res is String) {
50+
result = res;
51+
}
52+
});
53+
},
54+
child: const Text('Open Scanner')),
55+
Text('Barcode Result: $result'),
10556
],
10657
),
10758
),
108-
floatingActionButton: FloatingActionButton(
109-
onPressed: _incrementCounter,
110-
tooltip: 'Increment',
111-
child: const Icon(Icons.add),
112-
), // This trailing comma makes auto-formatting nicer for build methods.
11359
);
11460
}
11561
}

example/pubspec.lock

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,27 @@ packages:
6262
description: flutter
6363
source: sdk
6464
version: "0.0.0"
65+
flutter_barcode_scanner:
66+
dependency: transitive
67+
description:
68+
name: flutter_barcode_scanner
69+
url: "https://pub.dartlang.org"
70+
source: hosted
71+
version: "2.0.0"
6572
flutter_lints:
6673
dependency: "direct dev"
6774
description:
6875
name: flutter_lints
6976
url: "https://pub.dartlang.org"
7077
source: hosted
7178
version: "2.0.1"
79+
flutter_plugin_android_lifecycle:
80+
dependency: transitive
81+
description:
82+
name: flutter_plugin_android_lifecycle
83+
url: "https://pub.dartlang.org"
84+
source: hosted
85+
version: "2.0.6"
7286
flutter_test:
7387
dependency: "direct dev"
7488
description: flutter
@@ -109,6 +123,20 @@ packages:
109123
url: "https://pub.dartlang.org"
110124
source: hosted
111125
version: "1.8.1"
126+
plugin_platform_interface:
127+
dependency: transitive
128+
description:
129+
name: plugin_platform_interface
130+
url: "https://pub.dartlang.org"
131+
source: hosted
132+
version: "2.1.2"
133+
simple_barcode_scanner:
134+
dependency: "direct main"
135+
description:
136+
path: ".."
137+
relative: true
138+
source: path
139+
version: "0.0.1"
112140
sky_engine:
113141
dependency: transitive
114142
description: flutter
@@ -163,5 +191,41 @@ packages:
163191
url: "https://pub.dartlang.org"
164192
source: hosted
165193
version: "2.1.2"
194+
webview_flutter:
195+
dependency: "direct main"
196+
description:
197+
name: webview_flutter
198+
url: "https://pub.dartlang.org"
199+
source: hosted
200+
version: "3.0.4"
201+
webview_flutter_android:
202+
dependency: transitive
203+
description:
204+
name: webview_flutter_android
205+
url: "https://pub.dartlang.org"
206+
source: hosted
207+
version: "2.8.8"
208+
webview_flutter_platform_interface:
209+
dependency: transitive
210+
description:
211+
name: webview_flutter_platform_interface
212+
url: "https://pub.dartlang.org"
213+
source: hosted
214+
version: "1.9.0"
215+
webview_flutter_wkwebview:
216+
dependency: transitive
217+
description:
218+
name: webview_flutter_wkwebview
219+
url: "https://pub.dartlang.org"
220+
source: hosted
221+
version: "2.7.5"
222+
webview_windows:
223+
dependency: transitive
224+
description:
225+
name: webview_windows
226+
url: "https://pub.dartlang.org"
227+
source: hosted
228+
version: "0.1.9"
166229
sdks:
167230
dart: ">=2.17.0 <3.0.0"
231+
flutter: ">=2.5.0"

example/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ dependencies:
3131
sdk: flutter
3232
simple_barcode_scanner:
3333
path: ../
34+
webview_flutter: ^3.0.4
3435

3536

3637
# The following adds the Cupertino Icons font to your application.
@@ -61,8 +62,7 @@ flutter:
6162

6263
# To add assets to your application, add an assets section, like this:
6364
# assets:
64-
# - images/a_dot_burr.jpeg
65-
# - images/a_dot_ham.jpeg
65+
# - assets/barcode.html
6666

6767
# An image asset can refer to one or more resolution-specific "variants", see
6868
# https://flutter.dev/assets-and-images/#resolution-aware

example/windows/flutter/generated_plugin_registrant.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
#include "generated_plugin_registrant.h"
88

9+
#include <webview_windows/webview_windows_plugin.h>
910

1011
void RegisterPlugins(flutter::PluginRegistry* registry) {
12+
WebviewWindowsPluginRegisterWithRegistrar(
13+
registry->GetRegistrarForPlugin("WebviewWindowsPlugin"));
1114
}

example/windows/flutter/generated_plugins.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#
44

55
list(APPEND FLUTTER_PLUGIN_LIST
6+
webview_windows
67
)
78

89
list(APPEND FLUTTER_FFI_PLUGIN_LIST

lib/assets/barcode.html

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<title></title>
5+
<meta charset="UTF-8">
6+
<meta name="viewport" content="width=device-width, initial-scale=1">
7+
<style>
8+
/* In order to place the tracking correctly */
9+
canvas.drawing, canvas.drawingBuffer {
10+
position: absolute;
11+
left: 0;
12+
top: 0;
13+
}
14+
html, body {
15+
height: 100%; /* IMPORTANT!!! Stretches viewport to 100% */
16+
}
17+
</style>
18+
<script src="html5-qrcode.min.js"></script>
19+
</head>
20+
<body>
21+
<!-- Div to show the scanner -->
22+
<div id="reader" ></div>
23+
<script>
24+
const html5QrCode = new Html5Qrcode("reader");
25+
console.log("Starting SCANNGING CODE");
26+
const qrCodeSuccessCallback = (decodedText, decodedResult) => {
27+
/* handle success for web */
28+
window.parent.postMessage(decodedText, "*");
29+
30+
/* handle success for window */
31+
var param = {
32+
"methodName":"submitCallback",
33+
"data":decodedText
34+
}
35+
submitCallback(JSON.stringify(param));
36+
};
37+
const config = { fps: 10, qrbox: { width: 280, height: 120 } };
38+
39+
// If you want to prefer back camera
40+
html5QrCode.start({ facingMode: "environment" }, config, qrCodeSuccessCallback);
41+
//html5QrCode.start({ facingMode: "user" }, config, qrCodeSuccessCallback);
42+
43+
44+
</script>
45+
</body>
46+
</html>

lib/assets/html5-qrcode.min.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/constant.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class PackageConstant {
2+
static const barcodeFilePath =
3+
"packages/simple_barcode_scanner/assets/barcode.html";
4+
static const barcodeFileWebPath =
5+
"assets/packages/simple_barcode_scanner/assets/barcode.html";
6+
}

0 commit comments

Comments
 (0)