100 lines
2.7 KiB
Dart
100 lines
2.7 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:camera/camera.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
class CameraScreen extends StatefulWidget {
|
|
@override
|
|
_CameraScreenState createState() => _CameraScreenState();
|
|
}
|
|
|
|
class _CameraScreenState extends State<CameraScreen> {
|
|
CameraController? controller;
|
|
List<CameraDescription>? cameras;
|
|
XFile? capturedImage;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
initCamera();
|
|
}
|
|
|
|
Future<void> initCamera() async {
|
|
await Permission.camera.request();
|
|
|
|
if (await Permission.camera.isGranted) {
|
|
cameras = await availableCameras();
|
|
controller = CameraController(cameras![0], ResolutionPreset.high);
|
|
|
|
await controller!.initialize();
|
|
setState(() {}); // update UI setelah kamera siap
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
controller?.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
if (controller == null || !controller!.value.isInitialized) {
|
|
return Center(child: CircularProgressIndicator());
|
|
}
|
|
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text('Camera'),
|
|
leading: IconButton(
|
|
icon: Icon(Icons.arrow_back),
|
|
onPressed: () {
|
|
Navigator.pop(context);
|
|
},
|
|
),
|
|
),
|
|
body: Stack(
|
|
children: [
|
|
CameraPreview(controller!),
|
|
if (capturedImage != null)
|
|
Positioned.fill(
|
|
child: Image.file(File(capturedImage!.path), fit: BoxFit.cover),
|
|
),
|
|
Align(
|
|
alignment: Alignment.bottomCenter,
|
|
child: Padding(
|
|
padding: const EdgeInsets.only(bottom: 30),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
FloatingActionButton(
|
|
backgroundColor: Colors.white,
|
|
onPressed: () async {
|
|
final image = await controller!.takePicture();
|
|
setState(() {
|
|
capturedImage = image;
|
|
});
|
|
|
|
Navigator.pop(context, capturedImage?.path);
|
|
},
|
|
child: Icon(Icons.camera_alt, color: Colors.black),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
// floatingActionButton: FloatingActionButton(
|
|
// onPressed: () async {
|
|
// final image = await controller!.takePicture();
|
|
// print('Gambar disimpan di: ${image.path}');
|
|
// // Bisa dilanjutkan untuk upload, crop, dll
|
|
// },
|
|
// child: Icon(Icons.camera_alt),
|
|
// ),
|
|
);
|
|
}
|
|
}
|