Flutter文件管理器插件explorer的使用

Flutter文件管理器插件explorer的使用

explorer

通用的文件浏览器UI插件,用于导航文件、FTP等。

支持自定义提供程序和任何平台。

Showcase

上下文菜单 操作 新建与上传

Getting Started

在您的Flutter项目中添加依赖项:

dependencies:
  explorer: any

导入必要的库:

/// 主要导入
import 'package:explorer/explorer.dart';

/// 导入用于[IoExplorerProvider]。仅适用于IO(不适用于Web)
import 'package:explorer/explorer_io.dart';

Api overview

ExplorerController

参数 描述 是否必需 默认值
provider 负责导航任何类型的文件结构的实体,例如IoExplorerProvider用于IO [x] -

Explorer

参数 描述 是否必需 默认值
controller 已初始化的ExplorerController实例 [x] -
builder 用于完全自定义UI的构建器回调 [x] -
bottomBarBuilder 底部栏的附加构建器 [ ] -
uploadFiles 点击上传文件操作时调用的回调(只有当回调存在时才显示此操作) [ ] -
filePressed 文件被按下时调用的回调 [ ] -

ExplorerToolbar

顶部工具栏,带有面包屑和操作。

ExplorerActionView

带有实际命令的操作视图(复制/移动到这里等)。

ExplorerFilesGridView

以网格形式显示文件。

Examples

Simple example

完整代码见 example目录

/// 在initState中初始化控制器
_controller = ExplorerController(
  provider: IoExplorerProvider(
    entryPath: '/path/to/entry', // 对于IO探索器,传递一些入口路径
  ),
)

Explorer(
  controller: _controller,

  // 自定义UI,通过Explorer和您自己的小部件!
  builder: (_) => [
    ExplorerToolbar(),
    ExplorerActionView(),
    ExplorerFilesGridView(),
  ],
  // 当在探索器中点击文件时调用的回调
  filePressed: (file) {
    if (file.size > 200000) {
      final snackBar =
          SnackBar(content: Text('不能打开大于200KB的文件'));

      // 在widget树中找到Scaffold并使用它来显示Snack Bar。
      ScaffoldMessenger.of(context).showSnackBar(snackBar);
      return;
    }
  }
)

Custom provider

您需要实现ExplorerProvider并将结果作为提供程序传递给ExplorerController。您可以创建任何提供程序:FTP、REST API等。

abstract class ExplorerProvider {
  /// 探索器的起始路径
  String get entryPath;

  /// 探索器的实际路径
  String get currentPath;

  /// 导航到特定路径
  Future<List<Entry>> go(String path);

  /// 在[currentPath]创建新目录
  Future<ExplorerDirectory> newDirectory(String name);

  /// 在[currentPath]创建新文件
  Future<ExplorerFile> newFile(String name);

  /// 递归删除[currentPath]的文件或目录
  Future<void> remove(Entry name);

  /// 复制文件或目录
  Future<void> copy(Entry from, Entry to);
}

完整示例代码

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

import 'dart:io';

import 'package:explorer/explorer_io.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:path_provider/path_provider.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final Directory appDocDir = await getApplicationDocumentsDirectory();
  runApp(MyApp(appDocDir: appDocDir));
}

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

  final Directory appDocDir;

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

class _MyAppState extends State<MyApp> {
  late ExplorerController _controller;

  [@override](/user/override)
  void initState() {
    _controller = ExplorerController(
      provider: IoExplorerProvider(
        entryPath: widget.appDocDir.path,
      ),
    );

    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void filePressed(ExplorerFile file) {
    if ((file.size ?? 0) > 200000) {
      final snackBar =
          SnackBar(content: Text('不能打开大于200KB的文件'));

      // 在widget树中找到Scaffold并使用它来显示Snack Bar。
      ScaffoldMessenger.of(context).showSnackBar(snackBar);
      return;
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) => MaterialApp(
        localizationsDelegates: [
          ExplorerLocalizationsDelegate(),
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
        ],
        supportedLocales: [
          const Locale('en', ''),
          const Locale('ru', ''),
          const Locale('fr', ''),
        ],
        home: Scaffold(
          body: Explorer(
            controller: _controller,
            builder: (_) => [
              ExplorerToolbar(),
              ExplorerActionView(),
              ExplorerFilesGridView(),
            ],
            filePressed: filePressed,
          ),
        ),
      );
}

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

1 回复

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


在Flutter中,file_explorer 插件可以帮助你实现文件管理功能,例如浏览文件、选择文件、创建文件夹等。然而,截至2023年,file_explorer 插件并不是一个广泛使用的插件,你可能需要寻找其他替代方案,如 file_pickerflutter_file_manager 等插件。

以下是一个使用 file_picker 插件的示例,它可以帮助你实现文件选择和管理功能:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  file_picker: ^5.2.5

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

2. 使用 file_picker 选择文件

以下是一个简单的示例,展示如何使用 file_picker 插件来选择文件:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FilePickerDemo(),
    );
  }
}

class FilePickerDemo extends StatefulWidget {
  [@override](/user/override)
  _FilePickerDemoState createState() => _FilePickerDemoState();
}

class _FilePickerDemoState extends State<FilePickerDemo> {
  String _filePath = 'No file selected';

  Future<void> _pickFile() async {
    FilePickerResult? result = await FilePicker.platform.pickFiles();

    if (result != null) {
      PlatformFile file = result.files.first;
      setState(() {
        _filePath = file.path ?? 'File path not available';
      });
    } else {
      setState(() {
        _filePath = 'No file selected';
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Picker Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Selected file:',
              style: TextStyle(fontSize: 18),
            ),
            Text(
              _filePath,
              style: TextStyle(fontSize: 16, color: Colors.blue),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickFile,
              child: Text('Pick a file'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部