Flutter相机拍照与图片选择插件flutter_camera_picker的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter相机拍照与图片选择插件flutter_camera_picker的使用

功能

flutter_camera_picker 插件允许您一次性拍摄多张照片,并将这些照片返回给您进行处理。以下是该插件的一些功能:

  • 预览Preview 1 Preview 2

入门指南

此插件依赖于 camera 包,因此请按照 camera 包的设置步骤为 iOS 和 Android 进行配置。

使用方法

以下是一个完整的示例代码,展示了如何使用 flutter_camera_picker 插件来实现相机拍照和图片选择功能。

import 'package:flutter/material.dart';
import 'package:flutter_camera_picker/flutter_camera_picker.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const HomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class HomePage extends StatelessWidget {
  final String title;

  const HomePage({Key? key, required this.title}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: HookBuilder(builder: (context) {
          // 使用 useState 钩子来管理选中的图片列表
          final files = useState<List<XFile>>([]);

          return Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              if (files.value.isEmpty)
                const Text('您还没有选择任何文件'),
              if (files.value.isNotEmpty)
                ImagesPreview(files: files.value), // 显示已选中的图片预览
              const SizedBox(height: 16),
              ElevatedButton(
                onPressed: () async {
                  // 打开相机选择器
                  final results = await Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (context) => CameraPicker(
                        initialFiles: files.value, // 初始化时传入选中的图片
                        onDelete: (file) async {
                          // 删除图片时弹出确认对话框
                          final confirm = (await showDialog(
                                context: context,
                                builder: (context) => AlertDialog(
                                  title: const Text('删除图片?'),
                                  content: const Text('您确定要删除这张图片吗?'),
                                  actions: [
                                    TextButton(
                                      onPressed: () {
                                        Navigator.of(context).pop(false);
                                      },
                                      child: const Text('取消'),
                                    ),
                                    TextButton(
                                      onPressed: () {
                                        Navigator.of(context).pop(true);
                                      },
                                      child: const Text('确定'),
                                    ),
                                  ],
                                ),
                              )) ??
                              false;
                          return confirm;
                        },
                      ),
                    ),
                  );

                  // 如果有新的图片被选中,更新状态
                  if (results != null) {
                    files.value = List.from(results);
                  }
                },
                child: const Text('从相机拍摄图片'),
              ),
            ],
          );
        }),
      ),
    );
  }
}

// 图片预览组件
class ImagesPreview extends StatelessWidget {
  final List<XFile> files;

  const ImagesPreview({Key? key, required this.files}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GridView.builder(
      shrinkWrap: true,
      gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 3,
        crossAxisSpacing: 8.0,
        mainAxisSpacing: 8.0,
      ),
      itemCount: files.length,
      itemBuilder: (context, index) {
        return Image.file(
          File(files[index].path),
          fit: BoxFit.cover,
        );
      },
    );
  }
}

更多关于Flutter相机拍照与图片选择插件flutter_camera_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter相机拍照与图片选择插件flutter_camera_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个使用 flutter_camera_picker 插件在 Flutter 应用中实现相机拍照与图片选择的示例代码。

首先,你需要在 pubspec.yaml 文件中添加 flutter_camera_picker 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_camera_picker: ^latest_version  # 请替换为最新版本号

然后运行 flutter pub get 以获取依赖。

接下来是主要的 Dart 代码示例,它展示了如何使用 flutter_camera_picker 插件来实现相机拍照和图片选择功能:

import 'package:flutter/material.dart';
import 'package:flutter_camera_picker/flutter_camera_picker.dart';
import 'dart:io';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CameraPickerScreen(),
    );
  }
}

class CameraPickerScreen extends StatefulWidget {
  @override
  _CameraPickerScreenState createState() => _CameraPickerScreenState();
}

class _CameraPickerScreenState extends State<CameraPickerScreen> {
  File? _imageFile;

  Future<void> _pickImage() async {
    final pickedFile = await CameraPicker.pickImage(source: CameraSource.cameraAndGallery);

    if (pickedFile != null) {
      setState(() {
        _imageFile = File(pickedFile.path);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Camera Picker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _imageFile == null
                ? Text('No image selected.')
                : Image.file(_imageFile!),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Pick Image from Camera or Gallery'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:在 pubspec.yaml 文件中添加 flutter_camera_picker 依赖。
  2. 导入包:在 Dart 文件中导入 flutter_camera_picker 包。
  3. 主函数main 函数启动 MyApp widget。
  4. MyApp:这是一个 StatelessWidget,它返回 CameraPickerScreen 作为首页。
  5. CameraPickerScreen:这是一个 StatefulWidget,用于处理状态(如选择的图片)。
  6. _CameraPickerScreenState
    • _pickImage 方法:使用 CameraPicker.pickImage 方法从相机或图库中选择图片。
    • setState 方法:更新 _imageFile 状态,以便在界面上显示选择的图片。
    • build 方法:构建 UI,包括显示图片和选择图片的按钮。

这个示例展示了基本的相机拍照与图片选择功能。你可以根据需要进一步扩展,例如处理权限请求、添加错误处理等。

回到顶部