Flutter媒体选择插件media_picker_widget的使用

Flutter媒体选择插件media_picker_widget的使用

media_picker_widget 是一个方便在Flutter应用中选择媒体文件(如图片和视频)的插件。它支持单选或复选,并且可以自定义UI。以下是如何安装和使用这个插件的详细指南。

安装

pubspec.yaml 中添加依赖

首先,在你的 pubspec.yaml 文件中添加 media_picker_widget 依赖:

dependencies:
  flutter:
    sdk: flutter
  media_picker_widget: ^1.0.6 # 请确认这是最新版本

运行 flutter pub get 来安装依赖。

Android 配置

<project root>/android/app/src/main/AndroidManifest.xml 文件中添加权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- 如果你的app目标SDK是33 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>

确保 minSdkVersion 设置为21以上:

android {
    ...
    defaultConfig {
        ...
        minSdkVersion 21
    }
}

iOS 配置

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

<key>NSPhotoLibraryUsageDescription</key>
<string>我们需要访问您的相册来选择图片。</string>
<key>NSCameraUsageDescription</key>
<string>我们需要访问您的相机来拍摄图片。</string>
<key>NSMicrophoneUsageDescription</key>
<string>我们需要访问您的麦克风来录制视频。</string>

使用

基本使用

导入包并创建一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Media Picker',
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  List<Media> mediaList = [];

  void openImagePicker(BuildContext context) {
    showModalBottomSheet(
      context: context,
      builder: (context) {
        return MediaPicker(
          mediaList: mediaList,
          onPicked: (selectedList) {
            setState(() => mediaList = selectedList);
            Navigator.pop(context);
          },
          onCancel: () => Navigator.pop(context),
          mediaCount: MediaCount.multiple,
          mediaType: MediaType.all,
          decoration: PickerDecoration(
            blurStrength: 0,
            scaleAmount: 1,
            counterBuilder: (context, index) {
              if (index == null) return SizedBox();
              return Align(
                alignment: Alignment.topRight,
                child: Container(
                  decoration: BoxDecoration(
                    color: Colors.green,
                    borderRadius: BorderRadius.circular(8),
                  ),
                  padding: EdgeInsets.all(4),
                  child: Text(
                    '$index',
                    style: TextStyle(
                      color: Colors.white,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
              );
            },
          ),
        );
      },
    );
  }

  Widget previewList() {
    return SizedBox(
      height: 96,
      child: ListView(
        scrollDirection: Axis.horizontal,
        shrinkWrap: true,
        children: List.generate(
          mediaList.length,
          (index) => Padding(
            padding: const EdgeInsets.all(8.0),
            child: SizedBox(
              height: 80,
              width: 80,
              child: mediaList[index].thumbnail == null
                  ? SizedBox()
                  : Image.memory(
                      mediaList[index].thumbnail!,
                      fit: BoxFit.cover,
                    ),
            ),
          ),
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker'),
      ),
      body: previewList(),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () => openImagePicker(context),
      ),
    );
  }
}

自定义UI

你可以通过 PickerDecoration 类来自定义UI,甚至可以通过 HeaderBuilder 自定义头部。

headerBuilder: (context, albumPicker, onDone, onCancel) {
  return SizedBox(
    height: 46.0,
    child: Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        TextButton(onPressed: onCancel, child: const Text('Back')),
        Expanded(child: Center(child: albumPicker)),
        TextButton(onPressed: onDone, child: const Text('Done')),
      ],
    ),
  );
},

以上就是 media_picker_widget 的基本使用方法和一些自定义选项。更多细节和API参考可以查看 官方文档。希望这些信息对你有帮助!


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

1 回复

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


当然,以下是如何在Flutter项目中使用media_picker_widget插件的一个基本示例。这个插件允许用户从设备的图库或相机中选择媒体文件(如图片和视频)。

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

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

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

接下来,在你的Flutter应用中,你可以按照以下步骤使用MediaPickerWidget

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:media_picker_widget/media_picker_widget.dart';
  1. 创建一个屏幕来展示MediaPickerWidget
class MediaPickerScreen extends StatefulWidget {
  @override
  _MediaPickerScreenState createState() => _MediaPickerScreenState();
}

class _MediaPickerScreenState extends State<MediaPickerScreen> {
  List<MediaFile> _selectedMedia = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Media Picker Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(
              child: MediaPickerWidget(
                maxImages: 10, // 最大图片数量
                maxVideos: 5,  // 最大视频数量
                onSelectedMediaChanged: (List<MediaFile> mediaFiles) {
                  setState(() {
                    _selectedMedia = mediaFiles;
                  });
                },
              ),
            ),
            SizedBox(height: 20),
            Text('Selected Media:'),
            Expanded(
              child: GridView.builder(
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 3,
                  crossAxisSpacing: 4,
                  mainAxisSpacing: 4,
                ),
                itemCount: _selectedMedia.length,
                itemBuilder: (context, index) {
                  MediaFile media = _selectedMedia[index];
                  return Card(
                    child: ListTile(
                      leading: media.type == MediaType.image
                          ? Image.file(File(media.path))
                          : Icon(Icons.videocam),
                      title: Text(media.name),
                      subtitle: Text(media.path),
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}
  1. 在你的主应用中使用这个屏幕
void main() {
  runApp(MyApp());
}

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

这个示例展示了如何集成media_picker_widget插件,让用户能够从图库或相机中选择图片和视频,并在界面上显示选中的媒体文件。注意,实际使用时,你可能需要处理更多的错误情况和权限请求(如访问相机和图库的权限)。

请确保在Android和iOS项目中正确配置权限请求,特别是如果你打算让用户从相机拍摄媒体或从图库选择媒体。这通常涉及到在AndroidManifest.xmlInfo.plist中添加必要的权限声明。

回到顶部