import 'dart:io'; import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; List<CameraDescription> cameras; void main() async { /// 獲取設備上可用攝像頭的列表。 cameras = await availableCameras(); runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: HomePage(), ); } } class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { CameraController _controller; Future<void> _initializeControllerFuture; @override void initState() { init(); super.initState(); } init() async { /// 從可用攝像頭列表中獲取特定攝像頭。 final firstCamera = cameras.first; // 要顯示攝像機的當前輸出 // 建立一個CameraController _controller = CameraController( // 從可用攝像頭列表中獲取特定攝像頭 firstCamera, // 定義要使用的分辨率。 ResolutionPreset.medium, ); // 接下來,初始化控制器。 這將返回一個Future _initializeControllerFuture = _controller.initialize(); } @override void dispose() { _controller?.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( floatingActionButton: FloatingActionButton( child: Icon(Icons.camera_alt), onPressed: () async { try { // 確保已初始化攝像機。 await _initializeControllerFuture; final path = join( (await getTemporaryDirectory()).path, '${DateTime.now()}.png'); await _controller.takePicture(path); Navigator.push( context, MaterialPageRoute( builder: (context) => DisplayPictureScreen(imagePath: path), ), ); } catch (e) { print(e); } }, ), body: FutureBuilder<void>( future: _initializeControllerFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { // If the Future is complete, display the preview. return AspectRatio( aspectRatio: _controller.value.aspectRatio, child: CameraPreview(_controller), ); } else { return Center(child: CircularProgressIndicator()); } }, ), ); } } class DisplayPictureScreen extends StatelessWidget { final String imagePath; const DisplayPictureScreen({Key key, this.imagePath}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Display the Picture')), body: Image.file(File(imagePath)), ); } }