Flutter文件选择插件forme_file_picker的使用

Flutter文件选择插件forme_file_picker的使用

FormeFileGrid

这个插件仅提供了移动、排序和展示已选文件的功能。你必须自行实现文件选择功能,可以使用file_picker或其他插件来完成。

示例

示例页面

截图

forme_file_grid

使用方法

FormeFileGrid({
  Duration? animateDuration, /// 动画持续时间,默认为150毫秒
  int? maximum, /// 可容纳的最大文件数量,空表示无限制,默认为空
  required SliverGridDelegate gridDelegate, /// 必须提供一个SliverGridDelegate
  InputDecoration? decoration, /// 输入框装饰
  bool showFilePickerWhenReadOnly = true, // 是否在只读模式下显示选择器,默认为true
  bool disableFilePicker = false, // 是否始终禁用文件选择器,默认为false
  Color? filePickerColor, // 选择器的颜色,默认为Colors.grey.withOpacity(0.3)
  Color? filePickerDisabledColor, // 选择器禁用时的颜色,默认为主题禁用颜色
  Widget? filePickerChild, // 选择器内的子组件,默认为添加图标
  bool showGridItemRemoveWidget = true, // 是否在网格项上显示删除图标,默认为true
  Curve? slideCurve, // 滑动动画曲线
  /// 当缩略图创建失败或图像加载失败时构建的部件
  Widget Function(
      BuildContext context,
      FormeFile item,
      VoidCallback retry,
      Object error,
      StackTrace? stackTrace)? imageLoadingErrorBuilder,
  BoxFit imageFit = BoxFit.cover, // 图像填充方式,默认为覆盖
  bool Function(FormeFile, int)? removable, // 文件或索引是否可移除,默认可以移除
  bool Function(FormeFile, int)? draggable, // 文件或索引是否可拖动,默认可拖动
  Duration? longPressDelayStartDrag, // 长按开始拖动的延迟,默认为500毫秒
  Widget Function(BuildContext, FormeFile, int, Widget)? childWhenDraggingBuilder, // 拖动时的子组件构建器
  Widget Function(BuildContext, FormeFile, int, Widget, Size?)? feedbackBuilder, // 拖动时的反馈构建器
  bool reOrderable = true, // 文件是否可通过拖动重新排序,默认为true
  Widget Function(
    BuildContext context,
    FormeFile item,
    Widget child,
    ImageChunkEvent? loadingProgress,
    bool isImageLoaded,
  )? imageLoadingBuilder, // 加载进度构建器
  ValueChanged<FormeFile>? onGridItemTap, // 网格项点击回调
  OnFileUploadSuccess? onUploadSuccess, // 上传成功回调
  ONFileUploadFail? onUploadFail, // 上传失败回调
  void Function(FormeFileGridState state, int? maximum) pickFiles, // 选择文件回调
  Widget Function(FormeFileGridState state)? filePickerBuilder, // 文件选择器构建器
  /// 缩略图正在生成时构建的部件
  Widget Function(
    BuildContext context,
    FormeFile item,
  )? thumbnailLoadingBuilder,
  /// 默认为BoxDecoration(color: Colors.black.withOpacity(0.3))
  BoxDecoration? uploadBackgroundDecoration,
  IconData? uploadErrorIconData, // 上传错误图标
  IconData? uploadIconData, // 上传图标
  Color? uploadErrorIconColor, // 上传错误图标颜色
  Color? uploadIconColor, // 上传图标颜色
  Widget? gridItemRemoveWidget, // 网格项删除图标
})

FormeFile

abstract class FormeFile {
  Future<ImageProvider> get thumbnail; /// 获取文件缩略图
}

UploadableFormeFile

abstract class UploadableFormeFile<T> extends FormeFile {
  Future<T> upload(); /// 上传文件
  /// 如果你的上传可以取消,重写此方法
  void cancelUpload() {}

  bool get autoUpload => false; // 是否自动上传
}

完整示例代码

import 'package:flutter/material.dart';
import 'package:forme/forme.dart';
import 'package:file_picker/file_picker.dart'; // 引入file_picker插件

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  FormeKey key = FormeKey();
  
  List<PlatformFile> selectedFiles = []; // 存储选择的文件列表

  // 选择文件的方法
  void pickFiles() async {
    FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true);
    if (result != null) {
      setState(() {
        selectedFiles = result.files;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: pickFiles,
              child: Text('选择文件'),
            ),
            FormeFileGrid(
              key: key,
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3),
              pickFiles: (state, max) {
                pickFiles();
              },
              filePickerBuilder: (state) {
                return ElevatedButton(
                  onPressed: () {
                    pickFiles();
                  },
                  child: Text('选择文件'),
                );
              },
              onGridItemTap: (file) {
                print("Selected file: ${file.name}");
              },
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用forme_file_picker插件的一个示例代码案例。这个插件可以帮助你在Flutter应用中实现文件选择功能。

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

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

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

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

1. 导入包

在你的Dart文件中导入forme_file_picker包:

import 'package:forme_file_picker/forme_file_picker.dart';

2. 使用FormeFilePicker

下面是一个完整的示例,展示如何在Flutter应用中使用FormeFilePicker来选择文件:

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

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

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

class FilePickerDemo extends StatefulWidget {
  @override
  _FilePickerDemoState createState() => _FilePickerDemoState();
}

class _FilePickerDemoState extends State<FilePickerDemo> {
  FilePickerResult? _result;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Picker Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _result != null
                  ? 'Selected File: ${_result!.files.first.path}'
                  : 'No file selected',
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                final result = await FormeFilePicker.pickFiles(
                  type: FileType.any, // 可以是FileType.image, FileType.video, FileType.custom等
                  allowMultiple: false, // 是否允许多选
                );

                setState(() {
                  _result = result;
                });
              },
              child: Text('Select File'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 运行应用

将上述代码添加到你的Flutter项目中,然后运行应用。你将看到一个简单的界面,上面有一个按钮用于选择文件,以及显示所选文件路径的文本。

注意事项

  • 确保你的应用有权限访问设备的存储。在Android上,你可能需要在AndroidManifest.xml中添加相应的权限。
  • 根据你的需求,你可以调整FormeFilePicker.pickFiles方法的参数,比如typeallowMultiple

这个示例展示了如何使用forme_file_picker来选择文件,并在UI中显示所选文件的路径。根据你的具体需求,你可以进一步扩展这个示例。

回到顶部