Flutter图片选择插件gallery_picker的使用

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

Flutter图片选择插件gallery_picker的使用

gallery_picker简介

gallery_picker 是一个Flutter包,它允许您从相册中选择媒体文件,并且提供了现代化的工具和视图来管理和浏览您的相册。

Gallery Picker

主要特性

  • [✔] 现代化设计
  • [✔] 详细的文档
  • [✔] 单个或多个媒体文件的选择
  • [✔] 底部弹出式布局(BottomSheet)
  • [✔] 自动本地化最近的选项卡
  • [✔] 获取手机上的所有媒体文件
  • [✔] 高度可定制的设计(目标页面、英雄目标页面等)
  • [✔] 监听器功能以监听相册选择中的文件变化
  • [✔] 缩略图小部件用于显示媒体文件
  • [✔] 媒体提供者小部件用于查看视频/图像文件
  • [✔] GalleryPickerBuilder流构建器用于更新设计
  • [✔] 提供了即用型的小部件
  • [✔] 内置权限请求处理
  • [✔] 支持null-safety

示例代码

下面是一个完整的示例代码,演示如何使用 gallery_picker 插件进行单个或多个媒体文件的选择。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        brightness: Brightness.light,
      ),
      darkTheme: ThemeData(
        brightness: Brightness.dark,
      ),
      themeMode: ThemeMode.system,
      home: MyHomePage(title: "Gallery Picker"),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<MediaFile> selectedMedias = [];

  Future<void> pickMedia() async {
    List<MediaFile>? media = await GalleryPicker.pickMedia(
      context: context,
      initSelectedMedia: selectedMedias,
      extraRecentMedia: selectedMedias,
      startWithRecent: true,
    );
    if (media != null) {
      setState(() {
        selectedMedias += media;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Spacer(),
            const Text('These are your selected medias'),
            const Divider(),
            Expanded(
              flex: 5,
              child: Stack(children: [
                if (selectedMedias.isNotEmpty)
                  PageView.builder(
                    itemCount: selectedMedias.length,
                    itemBuilder: (context, index) {
                      return Center(
                        child: MediaProvider(
                          media: selectedMedias[index],
                        ),
                      );
                    },
                  ),
                if (selectedMedias.isNotEmpty)
                  Align(
                    alignment: Alignment.centerRight,
                    child: TextButton(
                      onPressed: () {},
                      child: const Icon(Icons.chevron_right, size: 100, color: Colors.red),
                    ),
                  ),
                if (selectedMedias.isNotEmpty)
                  Align(
                    alignment: Alignment.centerLeft,
                    child: TextButton(
                      onPressed: () {},
                      child: const Icon(Icons.chevron_left, size: 100, color: Colors.red),
                    ),
                  ),
              ]),
            ),
            SizedBox(
              height: 65,
              child: ListView.builder(
                scrollDirection: Axis.horizontal,
                itemCount: selectedMedias.length,
                itemBuilder: (context, index) {
                  return Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 5),
                    child: TextButton(
                      onPressed: () {},
                      child: Container(
                        width: 65,
                        height: 50,
                        decoration: BoxDecoration(border: Border.all(width: 2)),
                        child: ThumbnailMedia(media: selectedMedias[index]),
                      ),
                    ),
                  );
                },
              ),
            ),
            const Spacer(flex: 2),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: pickMedia,
        tooltip: 'Pick Media',
        child: const Icon(Icons.add),
      ),
    );
  }
}

使用步骤

1. 添加依赖

pubspec.yaml 文件中添加 gallery_picker 依赖:

dependencies:
  flutter:
    sdk: flutter
  gallery_picker: ^最新版本号

2. 配置项目

根据平台不同,需要配置一些权限和设置。

Android
  • 更新 build.gradle 文件中的 Kotlin 版本和 Gradle 插件版本。
  • AndroidManifest.xml 中添加权限声明:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- For SDK 33 and above -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
iOS
  • Info.plist 文件中添加必要的权限描述:
<key>NSPhotoLibraryUsageDescription</key>
<string>Privacy - Photo Library Usage Description</string>
<key>NSMotionUsageDescription</key>
<string>Motion usage description</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>NSPhotoLibraryAddUsageDescription</string>

3. 使用插件

通过调用 GalleryPicker.pickMedia 方法可以选择单个或多个媒体文件。还可以使用其他高级功能如监听文件选择变化、自定义目的地页面等。

以上就是 gallery_picker 的基本使用方法和完整示例代码。希望对您有所帮助!如果有任何问题,请随时提问。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用gallery_picker插件来选择图片的示例代码。这个插件允许用户从设备的图库中选择图片。

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

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

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

接下来,你可以在你的Flutter应用中实现图片选择功能。以下是一个完整的示例代码:

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

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

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

class GalleryPickerDemo extends StatefulWidget {
  @override
  _GalleryPickerDemoState createState() => _GalleryPickerDemoState();
}

class _GalleryPickerDemoState extends State<GalleryPickerDemo> {
  List<GalleryFile> _selectedImages = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Gallery Picker Demo'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: () async {
              final result = await GalleryPicker.pick(
                context: context,
                limit: 5, // 最大选择数量
                selectMode: SelectMode.multi, // 多选模式
              );

              if (result != null && result.isNotEmpty) {
                setState(() {
                  _selectedImages = result;
                });
              }
            },
            child: Text('选择图片'),
          ),
          SizedBox(height: 20),
          Expanded(
            child: GridView.builder(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 3,
                crossAxisSpacing: 4,
                mainAxisSpacing: 4,
              ),
              itemCount: _selectedImages.length,
              itemBuilder: (context, index) {
                final image = _selectedImages[index];
                return Image.file(
                  File(image.path),
                  fit: BoxFit.cover,
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含一个按钮和一个网格视图。点击按钮会打开图库选择器,允许用户选择图片。选中的图片会显示在下方的网格视图中。

注意几个关键点:

  1. GalleryPicker.pick方法用于打开图库选择器。你可以传递一些参数,如limit(最大选择数量)和selectMode(选择模式,可以是单选或多选)。
  2. result是一个List<GalleryFile>类型的对象,包含了用户选中的图片文件。
  3. 使用File(image.path)来创建Image.file小部件,以显示选中的图片。

确保你已经为应用添加了适当的权限,以便访问设备的图库。在Android上,你需要在AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在iOS上,通常不需要额外的配置,因为Flutter和iOS的权限管理系统会自动处理。

这个示例代码应该可以帮助你开始在Flutter项目中使用gallery_picker插件来选择图片。

回到顶部