Flutter图片选择类型插件image_picker_type的使用

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

Flutter图片选择类型插件image_picker_type的使用

image_picker_type 是一个适用于 Flutter 的插件,支持从图片库中选择图片、使用相机拍摄新照片,并且可以对图片进行裁剪。该插件支持 iOS、Android 和 Web 平台。

特性

  • ✅ iOS 支持
  • ✅ Android 支持
  • ✅ Web 支持

安装

iOS

<project root>/ios/Runner/Info.plist 文件中添加以下键值:

  • NSPhotoLibraryUsageDescription - 描述为什么你的应用需要访问照片库。在可视化编辑器中称为“Privacy - Photo Library Usage Description”。
  • NSCameraUsageDescription - 描述为什么你的应用需要访问相机。在可视化编辑器中称为“Privacy - Camera Usage Description”。
  • NSMicrophoneUsageDescription - 如果你打算录制视频,描述为什么你的应用需要访问麦克风。在可视化编辑器中称为“Privacy - Microphone Usage Description”。

Android

AndroidManifest.xml 中添加 UCropActivity

<activity
    android:name="com.yalantis.ucrop.UCropActivity"
    android:screenOrientation="portrait"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>

注意

从 v1.2.0 开始,你需要将 Android 项目迁移到 v2 嵌入(详情)。

API 29+

无需配置 - 插件应该开箱即用。

API < 29

AndroidManifest.xml<application> 标签中添加 android:requestLegacyExternalStorage="true" 属性。该属性在目标为 Android Q 的应用中默认为 false

Web

web/index.html 文件的 <head> 标签内添加以下代码:

<!-- Croppie -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/croppie/2.6.5/croppie.css" />
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/exif-js/2.3.0/exif.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/croppie/2.6.5/croppie.min.js"></script>

示例

以下是一个完整的示例代码,展示了如何使用 image_picker_type 插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  File? _image;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Sample Imagepicker Widget"),
        backgroundColor: Colors.black45,
      ),
      body: Center(
        child: Container(
          child: Column(
            children: [
              Container(
                color: Colors.black12,
                height: 300.0,
                width: 900.0,
                // ignore: unnecessary_null_comparison
                child: _image == null
                    ? Text("Still waiting!")
                    : Image.file(_image!),
              ),
              TextButton(
                child: Text(
                  "Select Image",
                  style: TextStyle(color: Colors.blue),
                ),
                onPressed: () {
                  // 显示底部弹出框以选择图片选项
                  showModalBottomSheet<void>(
                    context: context,
                    builder: (BuildContext context) {
                      return SafeArea(
                        child: ImagePickerHelper(
                          // isSave: true,  // 如果你想将图片保存到目录中
                          size: Size(300, 300),
                          onDone: (file) {
                            if (file == null) {
                              print(null);
                            } else {
                              setState(() {
                                _image = file;
                              });
                            }
                          },
                        ),
                      ); // 如果你不希望使用 SafeArea,可以删除它
                    },
                  );
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

开始使用

该项目是一个 Dart 包的起点,包含可以在多个 Flutter 或 Dart 项目中轻松共享的代码模块。

如果你刚开始使用 Flutter,可以查看我们的 在线文档,其中提供了教程、示例、移动开发指南以及完整的 API 参考。


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

1 回复

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


当然,下面是一个关于如何使用 image_picker_type 插件在 Flutter 中选择图片类型的示例代码。不过,需要注意的是,Flutter 社区中并没有一个直接名为 image_picker_type 的官方插件。这里我假设你是指使用 image_picker 插件来选择特定类型的图片(比如只选择照片或视频)。

Flutter 的 image_picker 插件允许用户从设备图库或相机中选择图片或视频。虽然它本身没有直接提供一个选项来过滤图片类型(如 JPEG 或 PNG),但你可以通过检查所选文件的扩展名来实现类似的功能。此外,你可以选择让用户选择图片或视频,但不能同时限制文件的具体类型(如 JPEG 图片)。

首先,确保你的 pubspec.yaml 文件中已经添加了 image_picker 依赖:

dependencies:
  flutter:
    sdk: flutter
  image_picker: ^0.8.4+4  # 请检查最新版本号

然后,运行 flutter pub get 来安装依赖。

接下来是一个简单的示例代码,展示如何使用 image_picker 插件来选择图片或视频:

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';

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

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

class ImagePickerScreen extends StatefulWidget {
  @override
  _ImagePickerScreenState createState() => _ImagePickerScreenState();
}

class _ImagePickerScreenState extends State<ImagePickerScreen> {
  final ImagePicker _picker = ImagePicker();
  File? _imageFile;
  File? _videoFile;

  Future<void> _pickImage(ImageSource source) async {
    final XFile? image = await _picker.pickImage(source: source);
    if (image != null) {
      // 检查文件扩展名,这里只是示例,实际中可能需要更复杂的逻辑
      String extension = image.path.split('.').last;
      if (extension == 'jpg' || extension == 'jpeg' || extension == 'png') {
        final File imageFile = File(image.path);
        setState(() {
          _imageFile = imageFile;
        });
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Unsupported image format')),
        );
      }
    }
  }

  Future<void> _pickVideo(ImageSource source) async {
    final XFile? video = await _picker.pickVideo(source: source);
    if (video != null) {
      final File videoFile = File(video.path);
      setState(() {
        _videoFile = videoFile;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            TextButton(
              onPressed: () => _pickImage(ImageSource.gallery),
              child: Text('Pick Image from Gallery'),
            ),
            SizedBox(height: 16),
            TextButton(
              onPressed: () => _pickImage(ImageSource.camera),
              child: Text('Pick Image from Camera'),
            ),
            SizedBox(height: 16),
            TextButton(
              onPressed: () => _pickVideo(ImageSource.gallery),
              child: Text('Pick Video from Gallery'),
            ),
            SizedBox(height: 16),
            if (_imageFile != null)
              Image.file(_imageFile!),
            if (_videoFile != null)
              SizedBox(
                height: 200,
                child: VideoPlayer(_videoFile!.path), // 注意:这里需要 VideoPlayer 插件来播放视频
              ),
          ],
        ),
      ),
    );
  }
}

// 注意:VideoPlayer 插件的使用需要额外设置和代码,这里仅作为示例提及
// 你需要添加 video_player 依赖并在代码中适当位置初始化 VideoPlayerController

注意

  1. 上述代码中的 VideoPlayer 小部件需要 video_player 插件来支持视频播放。你需要添加 video_player 依赖并处理视频播放的初始化逻辑。
  2. 检查文件扩展名的逻辑是基本示例,实际使用中可能需要更复杂的处理,特别是当文件名不包含扩展名或包含多个点时。
  3. 确保你的应用有访问设备存储和相机的权限。

这个示例展示了如何使用 image_picker 插件来选择图片或视频,并通过检查文件扩展名来简单地过滤图片类型。希望这对你有所帮助!

回到顶部