import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'dart:io';
class CameraScreen extends StatefulWidget {
@override
State<CameraScreen> createState() => _CameraScreenState();
}
class _CameraScreenState extends State<CameraScreen> {
CameraController? _controller;
XFile? _imageFile;
late Future<void> _initializeControllerFuture;
@override
void initState() {
super.initState();
_setupCamera();
}
Future<void> _setupCamera() async {
final cameras = await availableCameras();
final firstCamera = cameras.first;
_controller = CameraController(firstCamera, ResolutionPreset.medium);
_initializeControllerFuture = _controller!.initialize();
if (mounted) {
setState(() {});
}
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
Future<void> _takePhoto() async {
try {
await _initializeControllerFuture;
final image = await _controller!.takePicture();
setState(() {
_imageFile = image;
});
} catch (e) {
print('Error taking photo: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Camera Screen')),
body: Column(
children: [
Expanded(
flex: 3,
child: _controller == null
? Center(child: CircularProgressIndicator())
: FutureBuilder<void>(
future: _initializeControllerFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return CameraPreview(_controller!);
} else {
return Center(child: CircularProgressIndicator());
}
},
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: _controller == null ? null : _takePhoto,
child: Text('Take Photo'),
),
),
Expanded(
flex: 2,
child: _imageFile == null
? Center(child: Text('No photo taken yet'))
: Image.file(File(_imageFile!.path)),
),
],
),
);
}
}
We start by getting the list of available cameras asynchronously and pick the first one. Then we create a CameraController with medium resolution and initialize it. The CameraPreview widget shows the live camera feed once initialization is done.
The 'Take Photo' button calls _takePhoto() which uses the controller to capture a picture and saves it in _imageFile. We then display the captured photo below the button using Image.file.
We handle loading states with CircularProgressIndicator while the camera initializes. The UI updates reactively when a photo is taken.
This approach follows Flutter's camera package guidelines and ensures a smooth user experience.