flutter_mobile_vision 0.0.4 flutter_mobile_vision: ^0.0.4 copied to clipboard
Flutter implementation for Google Mobile Vision. Scan Barcodes, Recognize Text and Detect Faces.
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_mobile_vision/flutter_mobile_vision.dart';
import 'package:flutter_mobile_vision_example/barcode_detail.dart';
import 'package:flutter_mobile_vision_example/face_detail.dart';
import 'package:flutter_mobile_vision_example/ocr_text_detail.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
int _onlyFormatBarcode = Barcode.ALL_FORMATS;
bool _autoFocusBarcode = true;
bool _torchBarcode = false;
bool _multipleBarcode = false;
bool _waitTapBarcode = false;
bool _showTextBarcode = false;
List<Barcode> _barcodes = [];
bool _autoFocusOcr = true;
bool _torchOcr = false;
bool _multipleOcr = false;
bool _showTextOcr = true;
List<OcrText> _textsOcr = [];
bool _autoFocusFace = true;
bool _torchFace = false;
bool _multipleFace = true;
bool _showTextFace = true;
List<Face> _faces = [];
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
theme: new ThemeData(
primarySwatch: Colors.lime,
buttonColor: Colors.lime,
),
home: new DefaultTabController(
length: 3,
child: new Scaffold(
appBar: new AppBar(
bottom: new TabBar(
indicatorColor: Colors.black54,
tabs: [
new Tab(text: 'Barcode'),
new Tab(text: 'OCR'),
new Tab(text: 'Face')
],
),
title: new Text('Flutter Mobile Vision'),
),
body: new TabBarView(children: [
_getScanScreen(context),
_getOcrScreen(context),
_getFaceScreen(context),
]),
),
),
);
}
///
/// Scan formats
///
List<DropdownMenuItem<int>> _getFormats() {
List<DropdownMenuItem<int>> formatItems = [];
Barcode.mapFormat.forEach((key, value) {
formatItems.add(new DropdownMenuItem(
child: new Text(value),
value: key,
));
});
return formatItems;
}
///
/// Scan Screen
///
Widget _getScanScreen(BuildContext context) {
List<Widget> items = [];
items.add(new Padding(
padding: const EdgeInsets.only(
top: 8.0,
left: 18.0,
right: 18.0,
),
child: const Text('Scan format only:'),
));
items.add(new Padding(
padding: const EdgeInsets.only(
left: 18.0,
right: 18.0,
),
child: new DropdownButton(
items: _getFormats(),
onChanged: (value) => setState(
() => _onlyFormatBarcode = value,
),
value: _onlyFormatBarcode,
),
));
items.add(new SwitchListTile(
title: const Text('Auto focus:'),
value: _autoFocusBarcode,
onChanged: (value) => setState(() => _autoFocusBarcode = value),
));
items.add(new SwitchListTile(
title: const Text('Torch:'),
value: _torchBarcode,
onChanged: (value) => setState(() => _torchBarcode = value),
));
items.add(new SwitchListTile(
title: const Text('Multiple Scan:'),
value: _multipleBarcode,
onChanged: (value) => setState(() {
_multipleBarcode = value;
if (value) _waitTapBarcode = true;
}),
));
items.add(new SwitchListTile(
title: const Text('Wait a tap to capture:'),
value: _waitTapBarcode,
onChanged: (value) => setState(() {
_waitTapBarcode = value;
if (!value) _multipleBarcode = false;
}),
));
items.add(new SwitchListTile(
title: const Text('Show text:'),
value: _showTextBarcode,
onChanged: (value) => setState(() => _showTextBarcode = value),
));
items.add(
new Padding(
padding: const EdgeInsets.only(
left: 18.0,
right: 18.0,
bottom: 12.0,
),
child: new RaisedButton(
onPressed: _scan,
child: new Text('SCAN!'),
),
),
);
items.addAll(
ListTile.divideTiles(
context: context,
tiles: _barcodes
.map(
(barcode) => new BarcodeWidget(barcode),
)
.toList(),
),
);
return new ListView(
padding: const EdgeInsets.only(
top: 12.0,
),
children: items,
);
}
///
/// Scan Method
///
Future<Null> _scan() async {
List<Barcode> barcodes = [];
try {
barcodes = await FlutterMobileVision.scan(
flash: _torchBarcode,
autoFocus: _autoFocusBarcode,
formats: _onlyFormatBarcode,
multiple: _multipleBarcode,
waitTap: _waitTapBarcode,
showText: _showTextBarcode,
);
} on Exception {
barcodes.add(new Barcode('Failed to get barcode.'));
}
if (!mounted) return;
setState(() => _barcodes = barcodes);
}
///
/// OCR Screen
///
Widget _getOcrScreen(BuildContext context) {
List<Widget> items = [];
items.add(new SwitchListTile(
title: const Text('Auto focus:'),
value: _autoFocusOcr,
onChanged: (value) => setState(() => _autoFocusOcr = value),
));
items.add(new SwitchListTile(
title: const Text('Torch:'),
value: _torchOcr,
onChanged: (value) => setState(() => _torchOcr = value),
));
items.add(new SwitchListTile(
title: const Text('Multiple:'),
value: _multipleOcr,
onChanged: (value) => setState(() => _multipleOcr = value),
));
items.add(new SwitchListTile(
title: const Text('Show text:'),
value: _showTextOcr,
onChanged: (value) => setState(() => _showTextOcr = value),
));
items.add(
new Padding(
padding: const EdgeInsets.only(
left: 18.0,
right: 18.0,
bottom: 12.0,
),
child: new RaisedButton(
onPressed: _read,
child: new Text('READ!'),
),
),
);
items.addAll(
ListTile.divideTiles(
context: context,
tiles: _textsOcr
.map(
(ocrText) => new OcrTextWidget(ocrText),
)
.toList(),
),
);
return new ListView(
padding: const EdgeInsets.only(
top: 12.0,
),
children: items,
);
}
///
/// OCR Method
///
Future<Null> _read() async {
List<OcrText> texts = [];
try {
texts = await FlutterMobileVision.read(
flash: _torchOcr,
autoFocus: _autoFocusOcr,
multiple: _multipleOcr,
showText: _showTextOcr,
);
} on Exception {
texts.add(new OcrText('Failed to recognize text.'));
}
if (!mounted) return;
setState(() => _textsOcr = texts);
}
///
/// Face Screen
///
Widget _getFaceScreen(BuildContext context) {
List<Widget> items = [];
items.add(new SwitchListTile(
title: const Text('Auto focus:'),
value: _autoFocusFace,
onChanged: (value) => setState(() => _autoFocusFace = value),
));
items.add(new SwitchListTile(
title: const Text('Torch:'),
value: _torchFace,
onChanged: (value) => setState(() => _torchFace = value),
));
items.add(new SwitchListTile(
title: const Text('Multiple:'),
value: _multipleFace,
onChanged: (value) => setState(() => _multipleFace = value),
));
items.add(new SwitchListTile(
title: const Text('Show text:'),
value: _showTextFace,
onChanged: (value) => setState(() => _showTextFace = value),
));
items.add(
new Padding(
padding: const EdgeInsets.only(
left: 18.0,
right: 18.0,
bottom: 12.0,
),
child: new RaisedButton(
onPressed: _face,
child: new Text('DETECT!'),
),
),
);
items.addAll(
ListTile.divideTiles(
context: context,
tiles: _faces
.map(
(face) => new FaceWidget(face),
)
.toList(),
),
);
return new ListView(
padding: const EdgeInsets.only(
top: 12.0,
),
children: items,
);
}
///
/// Face Method
///
Future<Null> _face() async {
List<Face> faces = [];
try {
faces = await FlutterMobileVision.face(
flash: _torchFace,
autoFocus: _autoFocusFace,
multiple: _multipleFace,
showText: _showTextFace,
);
} on Exception catch (e) {
faces.add(new Face(-1));
}
if (!mounted) return;
setState(() => _faces = faces);
}
}
///
/// BarcodeWidget
///
class BarcodeWidget extends StatelessWidget {
final Barcode barcode;
BarcodeWidget(this.barcode);
@override
Widget build(BuildContext context) {
return new ListTile(
leading: const Icon(Icons.star),
title: new Text(barcode.displayValue),
subtitle: new Text(
'${barcode.getFormatString()} (${barcode.format}) - '
'${barcode.getValueFormatString()} (${barcode.valueFormat})',
),
trailing: const Icon(Icons.arrow_forward),
onTap: () => Navigator.of(context).push(
new MaterialPageRoute(
builder: (context) => new BarcodeDetail(barcode),
),
),
);
}
}
///
/// OcrTextWidget
///
class OcrTextWidget extends StatelessWidget {
final OcrText ocrText;
OcrTextWidget(this.ocrText);
@override
Widget build(BuildContext context) {
return new ListTile(
leading: const Icon(Icons.title),
title: new Text(ocrText.value),
subtitle: new Text(ocrText.language),
trailing: const Icon(Icons.arrow_forward),
onTap: () => Navigator.of(context).push(
new MaterialPageRoute(
builder: (context) => new OcrTextDetail(ocrText),
),
),
);
}
}
///
/// FaceWidget
///
class FaceWidget extends StatelessWidget {
final Face face;
FaceWidget(this.face);
@override
Widget build(BuildContext context) {
return new ListTile(
leading: const Icon(Icons.face),
title: new Text(face.id.toString()),
trailing: const Icon(Icons.arrow_forward),
onTap: () => Navigator.of(context).push(
new MaterialPageRoute(
builder: (context) => new FaceDetail(face),
),
),
);
}
}