目前使用
camera: ^0.9.8+1
import 'dart:ffi';
import 'dart:io';
import 'dart:typed_data';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:photo_view/photo_view_gallery.dart';
import 'package:ui_base/button/custom_button.dart';
import 'package:ui_base/extension/ext.dart';
import 'package:ui_base/widget/base_state.dart';
import 'package:ui_base/widget/ui_text.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:photo_view/photo_view.dart';
late List<CameraDescription> _cameras;
List<XFile> _photos = [];
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
_cameras = await availableCameras();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: CameraApp(),
);
}
}
/// CameraApp is the Main Application.
class CameraApp extends StatefulWidget {
/// Default Constructor
const CameraApp({Key? key}) : super(key: key);
@override
State<CameraApp> createState() => _CameraAppState();
}
class _CameraAppState extends BaseState<CameraApp> with WidgetsBindingObserver {
late CameraController controller;
@override
void initState() {
super.initState();
initCamera(0);
}
initCamera(int index, {double zoom = 1}) {
controller = CameraController(_cameras[index], ResolutionPreset.max);
controller.initialize().then((_) {
if (!mounted) {
return;
}
controller.setZoomLevel(zoom);
refresh();
}).catchError((Object e) {
if (e is CameraException) {
switch (e.code) {
case 'CameraAccessDenied':
print('User denied camera access.');
break;
default:
print('Handle other errors.');
break;
}
}
});
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
XFile? _lastImageFile;
@override
Widget build(BuildContext context) {
if (!controller.value.isInitialized) {
return Container();
}
return Scaffold(
body: SafeArea(child: Column(children: [
CameraPreview(controller).expanded(),
SizedBox(height: midPadding,),
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [
UIButton(
width: 50,
height: 50,
child: _lastImageFile != null ? Image.file(File(_lastImageFile!.path), fit: BoxFit.fill,) : null,
onTap: () {
if (_lastImageFile == null) return;
//navigatorPush(PhotoListView(_photos.reversed.toList()));
},
),
UIButton(
width: 64,
height: 64,
allRadius: 32,
backgroundColor: Colors.red,
onTap: () async {
try {
XFile file = await controller.takePicture();
Uint8List bytes = await file.readAsBytes();
final result = await ImageGallerySaver.saveImage(
bytes,
quality: 100,
name: "hello");
_lastImageFile = file;
_photos.add(file);
refresh();
} catch(e) {
}
},
),
SizedBox(width: 50, height: 50,)
], ).size(height: 200).padding(padding: EdgeInsets.only(left: 50, right: 50)),
],)),
backgroundColor: Colors.black,
);
void actionCard() {
}
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
final CameraController cameraController = controller;
// App state changed before we got the chance to initialize.
if (!cameraController.value.isInitialized) {
return;
}
if (state == AppLifecycleState.inactive) {
cameraController.dispose();
} else if (state == AppLifecycleState.resumed) {
initCamera(0);
}
}
Widget lensListView() {
return ListView.separated(
scrollDirection: Axis.horizontal,
itemBuilder: (context, index) {
CameraDescription? description = _cameras[index];
return UIButton(
onTap: () {
initCamera(index);
},
padding: EdgeInsets.only(left: smallPadding, right: smallPadding),
child: UIText(text: "镜头${index + 1}", color: Colors.white,),
);
},
separatorBuilder: (context, index) {
return SizedBox(width: smallPadding,);
},
itemCount: _cameras.length
).size(height: 30);
}
}