Flutter媒体选择器插件fast_media_picker的使用

Flutter媒体选择器插件fast_media_picker的使用

快速入门

fast_media_picker 是一个基于 Instagram 风格设计的媒体选择器插件。它允许用户从设备中选择图片或视频。

使用前的准备

在使用 fast_media_picker 之前,需要配置以下两个插件:

  1. photo_manager: 用于管理设备上的媒体文件。
  2. permission_handler: 用于请求权限。

建议您查看 示例代码 来确保正确配置。

配置 photo_manager

请阅读 photo_manager 的配置文档

配置 permission_handler

请阅读 permission_handler 的配置文档


使用方法

基本用法

以下是一个简单的示例,展示如何使用 fast_media_picker 选择图片:

List<AssetEntity>? result = await FastMediaPicker.pick(
    context,
    configs: FastMediaPickerConfigs(
        type: RequestType.image, // 选择类型(图片)
        pickLimit: 1, // 最多选择一张
        crossAxisCount: 4, // 网格布局的列数
    ),
);

获取选中的文件

AssetEntity 中获取第一个文件:

if (result == null || result.isEmpty) return;
File? image = await result.first.file;

自定义界面

您可以自定义 fast_media_picker 的授权请求界面。例如:

configs: FastMediaPickerConfigs(
    ...
    // 自定义授权请求界面
    permissionRequestWidget: DefaultPermissionRequestBody(
        titleText: '请授予访问相册的权限', // 标题
        messages: [
            PermissionRequestMessages(Icons.camera, '允许访问相机'),
        ],
        allowActionText: '允许', // 授权按钮文字
        goToSettingsActionText: '前往设置', // 设置按钮文字
    ),
),

完整示例代码

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

import 'dart:io';

import 'package:fast_media_picker/fast_media_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  runApp(const MyApp());
}

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _navigatorKey = GlobalKey<NavigatorState>();
  final _messangerKey = GlobalKey<ScaffoldMessengerState>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: _navigatorKey,
      scaffoldMessengerKey: _messangerKey,
      title: 'fast_media_picker',
      theme: ThemeData(
        colorScheme: const ColorScheme.light(
          primary: Colors.blue,
          onPrimary: Colors.white,
        ),
      ),
      darkTheme: ThemeData(
        colorScheme: const ColorScheme.dark(
          primary: Colors.blue,
          onPrimary: Colors.white,
        ),
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('fast_media_picker'),
          centerTitle: true,
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              // 模态弹出选择器
              TextButton(
                onPressed: () async {
                  final result = await FastMediaPicker.pick(
                    _navigatorKey.currentContext!,
                    configs: const FastMediaPickerConfigs(
                      type: RequestType.common, // 允许选择图片和视频
                      pickLimit: 1, // 最多选择一张
                      crossAxisCount: 4, // 网格布局的列数
                      childAspectRatio: 1, // 子项宽高比
                    ),
                  );
                  if (result == null) return;
                  _messangerKey.currentState!.showSnackBar(
                    SnackBar(
                      content: Text(result.toString()),
                    ),
                  );
                },
                child: const Text('Push picker - modal sheet'),
              ),
              // 故事风格选择器
              TextButton(
                onPressed: () async {
                  final result = await FastMediaPicker.pick(
                    _navigatorKey.currentContext!,
                    configs: const FastMediaPickerConfigs(
                      type: RequestType.common, // 允许选择图片和视频
                      pickLimit: 1, // 最多选择一张
                      crossAxisCount: 3, // 网格布局的列数
                      childAspectRatio: 9 / 16, // 子项宽高比
                    ),
                  );
                  if (result == null) return;
                  _messangerKey.currentState!.showSnackBar(
                    SnackBar(
                      content: Text(result.toString()),
                    ),
                  );
                },
                child: const Text('Push picker - story sheet'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
1 回复

更多关于Flutter媒体选择器插件fast_media_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


fast_media_picker 是一个用于 Flutter 的媒体选择器插件,它允许用户从设备的相册或文件系统中选择图片、视频等媒体文件。这个插件旨在提供一个快速、简单且高度可定制的媒体选择体验。

安装

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

dependencies:
  flutter:
    sdk: flutter
  fast_media_picker: ^1.0.0  # 请使用最新版本

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

基本用法

  1. 导入包

    import 'package:fast_media_picker/fast_media_picker.dart';
  2. 选择媒体文件

    你可以使用 FastMediaPicker.pickMedia 方法来选择媒体文件。以下是一个简单的示例:

    Future<void> pickMedia() async {
      try {
        final List<MediaFile>? mediaFiles = await FastMediaPicker.pickMedia(
          maxFiles: 5, // 最多选择5个文件
          mediaType: MediaType.image, // 选择图片
          allowMultiple: true, // 允许多选
        );
    
        if (mediaFiles != null) {
          for (var mediaFile in mediaFiles) {
            print('Selected file path: ${mediaFile.path}');
          }
        }
      } catch (e) {
        print('Error picking media: $e');
      }
    }
  3. 处理选择的媒体文件

    MediaFile 类包含了所选媒体文件的信息,如文件路径、文件类型等。你可以根据需要对文件进行处理,例如显示图片或上传文件。

参数说明

  • maxFiles: 最多可以选择多少个文件。
  • mediaType: 选择媒体文件的类型,可以是 MediaType.imageMediaType.videoMediaType.all
  • allowMultiple: 是否允许多选。
  • cameraOnly: 是否只允许从相机拍摄。
  • cropImage: 是否允许裁剪图片。
  • cropAspectRatio: 裁剪图片的宽高比。
  • compressImage: 是否压缩图片。
  • compressQuality: 图片压缩质量(0-100)。

示例代码

以下是一个完整的示例,展示了如何使用 fast_media_picker 选择并显示图片:

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

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

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

class MediaPickerExample extends StatefulWidget {
  @override
  _MediaPickerExampleState createState() => _MediaPickerExampleState();
}

class _MediaPickerExampleState extends State<MediaPickerExample> {
  List<MediaFile>? _mediaFiles;

  Future<void> _pickMedia() async {
    try {
      final List<MediaFile>? mediaFiles = await FastMediaPicker.pickMedia(
        maxFiles: 5,
        mediaType: MediaType.image,
        allowMultiple: true,
      );

      setState(() {
        _mediaFiles = mediaFiles;
      });
    } catch (e) {
      print('Error picking media: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Fast Media Picker Example'),
      ),
      body: Center(
        child: _mediaFiles == null
            ? Text('No media selected.')
            : ListView.builder(
                itemCount: _mediaFiles!.length,
                itemBuilder: (context, index) {
                  return Image.file(
                    File(_mediaFiles![index].path),
                    fit: BoxFit.cover,
                  );
                },
              ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _pickMedia,
        child: Icon(Icons.add_a_photo),
      ),
    );
  }
}

注意事项

  • 在 Android 上,你需要在 AndroidManifest.xml 中添加必要的权限,例如:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 在 iOS 上,你需要在 Info.plist 中添加相册访问权限的描述:

    <key>NSPhotoLibraryUsageDescription</key>
    <string>We need access to your photo library to select images.</string>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!