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

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

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

简介

flutter_media_picker_getx 是一个用于 Flutter 的媒体选择器插件,允许用户选择多张图片或视频,并支持相机集成。

特性

  • 支持多媒体选择(图片和视频)
  • 单选或多选支持
  • 相机集成
  • 可自定义的媒体数量限制

安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_media_picker_getx: ^0.0.6

Android权限

AndroidManifest.xml 中添加以下权限:

<uses-feature
    android:name="android.hardware.camera"
    android:required="false" />

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="29"
    tools:replace="android:maxSdkVersion" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="29" />
    
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />

iOS权限

Info.plist 中添加以下键值对以获取相机和照片库访问权限:

<key>NSCameraUsageDescription</key>
<string>我们需要访问您的相机来拍摄照片和视频。</string>

<key>NSPhotoLibraryUsageDescription</key>
<string>我们需要访问您的照片库来选择照片和视频。</string>

<key>NSPhotoLibraryAddUsageDescription</key>
<string>我们需要权限将照片和视频保存到您的照片库。</string>

使用方法

要使用媒体选择器,请遵循以下步骤:

  1. 导入包:

    import 'package:flutter_media_picker_getx/flutter_media_picker_getx.dart';
    
  2. 使用 MediaPicker 小部件打开媒体选择器:

    ElevatedButton(
      onPressed: () {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => MediaPicker(
              mediaCount: 10,
              selection: SelectionEnum.MultiMedia,
              multiSelection: true,
              cameraEnable: true,
              onPressedConfirm: myCallback,
            ),
          ),
        );
      },
      child: Text("Picker"),
    );
    

参数说明

  • mediaCount: 最大可选择项目数。
  • selection: 选择类型。使用 SelectionEnum.MultiMedia 选择图片和视频。
  • multiSelection: 布尔值,允许多选。
  • cameraEnable: 布尔值,启用选择器内的相机访问。
  • onPressedConfirm: 用户确认选择时触发的回调函数。

示例代码

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

import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_media_picker_getx/flutter_media_picker_getx.dart';
import 'package:get/get.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GetMaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(
        title: 'Picker',
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) => MediaPicker(
                              mediaCount: 10,
                              selection: SelectionEnum.MultiMedia,
                              multiSelection: true,
                              cameraEnable: true,
                              onPressedConfirm: myCallback,
                            )),
                  );
                },
                child: const Text("Picker")),
          ],
        ),
      ),
    );
  }

  Future<void> myCallback({required dynamic value}) async {
    if (value is List<MediaItem>) {
      for (var media in value) {
        if (media.type == MediaType.image) {
          final file = await media.assetEntity.file;
          if (file != null) {
            if (kDebugMode) {
              print("file $file");
            }
          }
        }
      }
    } else {
      if (value is MediaItem) {
        final file = await value.assetEntity.file;
        if (file != null) {
          if (kDebugMode) {
            print("file $file");
          }
        }
      }
    }
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 flutter_media_picker_getx 插件的示例代码。这个插件结合了 Flutter 和 GetX 状态管理库,用于选择媒体文件(图片和视频)。

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

dependencies:
  flutter:
    sdk: flutter
  get: ^4.6.1  # 确保使用兼容版本的 GetX
  flutter_media_picker_getx: ^latest_version  # 替换为最新版本号

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

接下来,我们编写一个简单的 Flutter 应用来演示如何使用 flutter_media_picker_getx 插件。

主应用文件 main.dart

import 'package:flutter/material.dart';
import 'package:flutter_media_picker_getx/flutter_media_picker_getx.dart';
import 'package:get/get.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Flutter Media Picker GetX Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MediaPickerScreen(),
    );
  }
}

class MediaPickerScreen extends StatelessWidget {
  final MediaPickerController mediaPickerController = Get.put(MediaPickerController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Media Picker GetX Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                final result = await mediaPickerController.pickMedia(
                  type: MediaType.image,
                  maxCount: 1,
                );
                if (result.isNotEmpty) {
                  // 显示选择的图片
                  final imageFile = result.first;
                  Get.snackbar('Selected Image', 'Path: ${imageFile.path}');
                }
              },
              child: Text('Pick Image'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                final result = await mediaPickerController.pickMedia(
                  type: MediaType.video,
                  maxCount: 1,
                );
                if (result.isNotEmpty) {
                  // 显示选择的视频
                  final videoFile = result.first;
                  Get.snackbar('Selected Video', 'Path: ${videoFile.path}');
                }
              },
              child: Text('Pick Video'),
            ),
          ],
        ),
      ),
    );
  }
}

说明

  1. 依赖注入:我们使用 Get.put(MediaPickerController()) 来创建并管理 MediaPickerController 的实例。
  2. 选择媒体:通过调用 mediaPickerController.pickMedia() 方法来选择媒体文件。这个方法接受一些参数,比如媒体类型 (MediaType.imageMediaType.video) 和最大选择数量 (maxCount)。
  3. 显示结果:选择完成后,通过 Get.snackbar 显示选择的媒体文件路径。

运行应用

确保你已经正确设置了 Android 和 iOS 的权限(特别是访问存储的权限),然后运行你的 Flutter 应用。你应该能够看到一个简单的界面,有两个按钮分别用于选择图片和视频。

注意事项

  • 确保你的设备或模拟器上已经有一些图片和视频文件,以便进行测试。
  • 根据需要调整 MediaTypemaxCount 参数。
  • 处理文件路径时,注意路径格式可能会因平台(Android/iOS)而异。

这个示例代码提供了一个基本的框架,你可以根据需求进一步扩展和自定义。

回到顶部