From 4d5e31e10906a527e49a09642e653a3f65d9475b Mon Sep 17 00:00:00 2001 From: Valentin CZERYBA Date: Sat, 6 Jul 2024 17:29:41 +0200 Subject: [PATCH] add screen camera wip --- covas_mobile/lib/pages/Camera.dart | 142 +++++++++++++++++++++++ covas_mobile/lib/pages/ListItemMenu.dart | 10 +- covas_mobile/pubspec.lock | 26 ++++- covas_mobile/pubspec.yaml | 2 + 4 files changed, 178 insertions(+), 2 deletions(-) diff --git a/covas_mobile/lib/pages/Camera.dart b/covas_mobile/lib/pages/Camera.dart index e69de29..d8baa08 100644 --- a/covas_mobile/lib/pages/Camera.dart +++ b/covas_mobile/lib/pages/Camera.dart @@ -0,0 +1,142 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:camera/camera.dart'; +import 'package:flutter/material.dart'; + +Future main() async { + // Ensure that plugin services are initialized so that `availableCameras()` + // can be called before `runApp()` + WidgetsFlutterBinding.ensureInitialized(); + + // Obtain a list of the available cameras on the device. + final cameras = await availableCameras(); + + // Get a specific camera from the list of available cameras. + final firstCamera = cameras.first; + + runApp( + MaterialApp( + theme: ThemeData.dark(), + home: Camera( + // Pass the appropriate camera to the TakePictureScreen widget. + camera: firstCamera, + ), + ), + ); +} + +// A screen that allows users to take a picture using a given camera. +class Camera extends StatefulWidget { + const Camera({ + super.key, + required this.camera, + }); + + final CameraDescription camera; + + @override + CameraState createState() => CameraState(); +} + +class CameraState extends State { + late CameraController _controller; + late Future _initializeControllerFuture; + + @override + void initState() { + super.initState(); + // To display the current output from the Camera, + // create a CameraController. + + _controller = CameraController( + // Get a specific camera from the list of available cameras. + widget.camera, + // Define the resolution to use. + ResolutionPreset.medium, + ); + + // Next, initialize the controller. This returns a Future. + _initializeControllerFuture = _controller.initialize(); + } + + Future getCamera() async {} + + @override + void dispose() { + // Dispose of the controller when the widget is disposed. + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Take a picture')), + // You must wait until the controller is initialized before displaying the + // camera preview. Use a FutureBuilder to display a loading spinner until the + // controller has finished initializing. + body: FutureBuilder( + future: _initializeControllerFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + // If the Future is complete, display the preview. + return CameraPreview(_controller); + } else { + // Otherwise, display a loading indicator. + return const Center(child: CircularProgressIndicator()); + } + }, + ), + floatingActionButton: FloatingActionButton( + // Provide an onPressed callback. + onPressed: () async { + // Take the Picture in a try / catch block. If anything goes wrong, + // catch the error. + try { + // Ensure that the camera is initialized. + await _initializeControllerFuture; + + // Attempt to take a picture and get the file `image` + // where it was saved. + final image = await _controller.takePicture(); + + if (!context.mounted) return; + + // If the picture was taken, display it on a new screen. + await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => DisplayPictureScreen( + // Pass the automatically generated path to + // the DisplayPictureScreen widget. + imagePath: image.path, + ), + ), + ); + } catch (e) { + // If an error occurs, log the error to the console. + print(e); + } + }, + child: const Icon(Icons.camera_alt), + ), + ); + } +} + +// A widget that displays the picture taken by the user. +class DisplayPictureScreen extends StatelessWidget { + final String imagePath; + + const DisplayPictureScreen({super.key, required this.imagePath}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Display the Picture')), + // The image is stored as a file on the device. Use the `Image.file` + // constructor with the given path to display the image. + body: Image.file(File(imagePath)), + ); + } +} diff --git a/covas_mobile/lib/pages/ListItemMenu.dart b/covas_mobile/lib/pages/ListItemMenu.dart index 31ee70a..2f31a10 100644 --- a/covas_mobile/lib/pages/ListItemMenu.dart +++ b/covas_mobile/lib/pages/ListItemMenu.dart @@ -1,12 +1,15 @@ import 'dart:convert'; import 'dart:io'; import "ItemMenu.dart"; +import "Camera.dart"; + import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; import '../classes/events.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; +import 'package:camera/camera.dart'; import '../variable/globals.dart' as globals; @@ -57,6 +60,11 @@ class _MyHomePageState extends State { return body; } + Future popCamera() async { + await availableCameras().then((value) => Navigator.push(context, + MaterialPageRoute(builder: (_) => Camera(camera: value.first)))); + } + // build function @override Widget build(BuildContext context) { @@ -117,7 +125,7 @@ class _MyHomePageState extends State { }, ), floatingActionButton: FloatingActionButton( - onPressed: () {}, + onPressed: popCamera, backgroundColor: Colors.blue, tooltip: 'Recherche', child: const Icon(Icons.search, color: Colors.white), diff --git a/covas_mobile/pubspec.lock b/covas_mobile/pubspec.lock index d57935d..8193353 100644 --- a/covas_mobile/pubspec.lock +++ b/covas_mobile/pubspec.lock @@ -233,13 +233,37 @@ packages: source: hosted version: "1.12.0" path: - dependency: transitive + dependency: "direct main" description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted version: "1.9.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + url: "https://pub.dev" + source: hosted + version: "2.1.3" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: bca87b0165ffd7cdb9cad8edd22d18d2201e886d9a9f19b4fb3452ea7df3a72a + url: "https://pub.dev" + source: hosted + version: "2.2.6" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" + source: hosted + version: "2.4.0" path_provider_linux: dependency: transitive description: diff --git a/covas_mobile/pubspec.yaml b/covas_mobile/pubspec.yaml index e5fe9b0..38dc88f 100644 --- a/covas_mobile/pubspec.yaml +++ b/covas_mobile/pubspec.yaml @@ -39,6 +39,8 @@ dependencies: intl: ^0.19.0 camera: ^0.11.0+1 camera_web: ^0.3.3 + path_provider: ^2.1.3 + path: ^1.9.0 dev_dependencies: flutter_test: