第9课:本地功能集成
🎯 学习目标
- 掌握相机和相册的访问方法
- 学会地理位置服务的集成
- 理解推送通知的实现
- 掌握设备信息的获取
- 能够集成多种本地功能
📋 课程内容
9.1 相机和相册
9.1.1 相机功能集成
import 'package:camera/camera.dart';
import 'package:image_picker/image_picker.dart';
class CameraExample extends StatefulWidget {@override_CameraExampleState createState() => _CameraExampleState();
}class _CameraExampleState extends State<CameraExample> {CameraController? _controller;List<CameraDescription> _cameras = [];int _selectedCameraIndex = 0;bool _isInitialized = false;@overridevoid initState() {super.initState();_initializeCamera();}Future<void> _initializeCamera() async {try {_cameras = await availableCameras();if (_cameras.isNotEmpty) {_controller = CameraController(_cameras[_selectedCameraIndex],ResolutionPreset.medium,);await _controller!.initialize();setState(() {_isInitialized = true;});}} catch (e) {print('相机初始化失败: $e');}}@overridevoid dispose() {_controller?.dispose();super.dispose();}@overrideWidget build(BuildContext context) {if (!_isInitialized) {return Scaffold(appBar: AppBar(title: Text('相机示例')),body: Center(child: CircularProgressIndicator()),);}return Scaffold(appBar: AppBar(title: Text('相机示例')),body: Column(children: [Expanded(child: CameraPreview(_controller!),),Container(padding: EdgeInsets.all(16),child: Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [IconButton(onPressed: _switchCamera,icon: Icon(Icons.switch_camera),iconSize: 32,),FloatingActionButton(onPressed: _takePicture,child: Icon(Icons.camera),),IconButton(onPressed: _pickFromGallery,icon: Icon(Icons.photo_library),iconSize: 32,),],),),],),);}void _switchCamera() {if (_cameras.length > 1) {_selectedCameraIndex = (_selectedCameraIndex + 1) % _cameras.length;_initializeCamera();}}Future<void> _takePicture() async {try {final image = await _controller!.takePicture();Navigator.push(context,MaterialPageRoute(builder: (context) => ImagePreviewPage(imagePath: image.path),),);} catch (e) {print('拍照失败: $e');}}Future<void> _pickFromGallery() async {try {final picker = ImagePicker();final pickedFile = await picker.pickImage(source: ImageSource.gallery);if (pickedFile != null) {Navigator.push(context,MaterialPageRoute(builder: (context) => ImagePreviewPage(imagePath: pickedFile.path),),);}} catch (e) {print('选择图片失败: $e');}}
}
class ImagePreviewPage extends StatelessWidget {final String imagePath;const ImagePreviewPage({Key? key, required this.imagePath}) : super(key: key);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('图片预览')),body: Center(child: Image.file(File(imagePath)),),);}
}
9.1.2 相册功能
class GalleryExample extends StatefulWidget {@override_GalleryExampleState createState() => _GalleryExampleState();
}class _GalleryExampleState extends State<GalleryExample> {final ImagePicker _picker = ImagePicker();List<XFile> _images = [];@overrideWidget build(BuildContext context) {return Scaffold