Skip to content

Instantly share code, notes, and snippets.

@cbetz
Created December 13, 2018 03:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cbetz/d7a41873ee2b1c349221223b7d95a572 to your computer and use it in GitHub Desktop.
Save cbetz/d7a41873ee2b1c349221223b7d95a572 to your computer and use it in GitHub Desktop.
Flutter Vision Camera
import 'dart:async';
import 'dart:io';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
class FlutterVisionHome extends StatefulWidget {
@override
_FlutterVisionHomeState createState() {
return _FlutterVisionHomeState();
}
}
void logError(String code, String message) =>
print('Error: $code\nError Message: $message');
class _FlutterVisionHomeState extends State<FlutterVisionHome> {
CameraController controller;
String imagePath;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
super.initState();
controller = CameraController(cameras[0], ResolutionPreset.medium);
controller.initialize().then((_) {
if (!mounted) {
return;
}
setState(() {});
});
}
@override
void dispose() {
controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(
title: const Text('Flutter Vision'),
),
body: Column(
children: <Widget>[
Expanded(
child: Container(
child: Padding(
padding: const EdgeInsets.all(1.0),
child: Center(
child: _cameraPreviewWidget(),
),
),
),
),
_captureControlRowWidget(),
],
),
);
}
/// Display the preview from the camera (or a message if the preview is not available).
Widget _cameraPreviewWidget() {
if (controller == null || !controller.value.isInitialized) {
return const Text(
'Tap a camera',
style: TextStyle(
color: Colors.white,
fontSize: 24.0,
fontWeight: FontWeight.w900,
),
);
} else {
return AspectRatio(
aspectRatio: controller.value.aspectRatio,
child: CameraPreview(controller),
);
}
}
/// Display the control bar with buttons to take pictures.
Widget _captureControlRowWidget() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
IconButton(
icon: const Icon(Icons.camera_alt),
color: Colors.blue,
onPressed: controller != null &&
controller.value.isInitialized
? onTakePictureButtonPressed
: null,
)
],
);
}
String timestamp() => DateTime.now().millisecondsSinceEpoch.toString();
void showInSnackBar(String message) {
_scaffoldKey.currentState.showSnackBar(SnackBar(content: Text(message)));
}
void onTakePictureButtonPressed() {
takePicture().then((String filePath) {
if (mounted) {
setState(() {
imagePath = filePath;
});
if (filePath != null) showInSnackBar('Picture saved to $filePath');
}
});
}
Future<String> takePicture() async {
if (!controller.value.isInitialized) {
showInSnackBar('Error: select a camera first.');
return null;
}
final Directory extDir = await getApplicationDocumentsDirectory();
final String dirPath = '${extDir.path}/Pictures/flutter_vision';
await Directory(dirPath).create(recursive: true);
final String filePath = '$dirPath/${timestamp()}.jpg';
if (controller.value.isTakingPicture) {
// A capture is already pending, do nothing.
return null;
}
try {
await controller.takePicture(filePath);
} on CameraException catch (e) {
_showCameraException(e);
return null;
}
return filePath;
}
void _showCameraException(CameraException e) {
logError(e.code, e.description);
showInSnackBar('Error: ${e.code}\n${e.description}');
}
}
class FlutterVisionApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: FlutterVisionHome(),
);
}
}
List<CameraDescription> cameras;
Future<void> main() async {
// Fetch the available cameras before initializing the app.
try {
cameras = await availableCameras();
} on CameraException catch (e) {
logError(e.code, e.description);
}
runApp(FlutterVisionApp());
}
@Maoe1
Copy link

Maoe1 commented Jul 28, 2020

when i run the app, i get an exception 'ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.
' with _stacktrace
( defaultBinaryMessenger. (package:flutter/src/services/binary_messenger.dart:93:7)
#1 defaultBinaryMessenger (package:flutter/src/services/binary_messenger.dart:106:4)
#2 MethodChannel.binaryMessenger (package:flutter/src/services/platform_channel.dart:145:62)
#3 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:151:35)
#4 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12)
#5 MethodChannel.invokeListMethod (package:flutter/src/services/platform_channel.dart:347:40)
#6 availableCameras (package:camera/camera.dart:81:10)
#7 main (package:camer_detect/main.dart:165:21)
#8 _runMainZoned.. (dart:ui/hooks.dart:233:25)
#9 _rootRun (dart:async/zone.dart:1190:13)
#10 _CustomZone.run (dart:async/zone.dart:1093:19)
#11 _runZoned (dart:async/zone.dart:1630:10)
#12 runZonedGuarded (dart:async/zone.dart:1618:12)
#13 _runMainZoned. (dart:ui/hooks.dart:225:5)
#14 _startIsolate. (dart:isolate-patch/isolate_patch.dart:301:19)
#15 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment