File Manager

 
 
 
 
 
FileManager is a wonderful widget that allows you to manage files and folders, pick files and folders, and do a lot more. Designed to feel like part of the Flutter framework.
Compatibility
✅   Android 
✅   Linux 
❌   Windows (in progress)
❌   MacOS (active issue: MacOS support) 
Usage
Make sure to check out examples for more details.
Installation
Dependencies Add the following line to pubspec.yaml:
dependencies:
  file_manager: ^1.0.0
Give storage permission to application
Android
Beside needing to add WRITE_EXTERNAL_STORAGE , READ_EXTERNAL_STORAGE and MANAGE_EXTERNAL_STORAGE to your android/app/src/main/AndroidManifest.xml.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxx.yyy">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
...
</manifest>
also add for Android 10
    <application
      android:requestLegacyExternalStorage="true"   
      .../>
You also need Runtime Request Permission
allow storage permission from app setting manually or you may use any package such as permission_handler.
or use FileManager to request permission at runtime.
  // request permission
  await controller.requestFilesAccessPermission();
  or 
  await FileManager.requestFilesAccessPermission();
Basic setup
The complete example is available here.
Required parameter for FileManager are controller and builder
- controllerThe controller updates value and notifies its listeners, and FileManager updates itself appropriately whenever the user modifies the path or changes the sort-type with an associated FileManagerController.
final FileManagerController controller = FileManagerController();
- builderThis function allows you to create custom widgets and retrieve a list of entities- List<FileSystemEntity>.
Sample code
FileManager(
    controller: controller,
    builder: (context, snapshot) {
    final List<FileSystemEntity> entities = snapshot;
      return ListView.builder(
        itemCount: entities.length,
        itemBuilder: (context, index) {
          return Card(
            child: ListTile(
              leading: FileManager.isFile(entities[index])
                  ? Icon(Icons.feed_outlined)
                  : Icon(Icons.folder),
              title: Text(FileManager.basename(entities[index])),
              onTap: () {
                if (FileManager.isDirectory(entities[index])) {
                    controller.openDirectory(entities[index]);   // open directory
                  } else {
                      // Perform file-related tasks.
                  }
              },
            ),
          );
        },
      );
  },
),
FileManager
| Properties | Description | 
|---|---|
| loadingScreen | For the loading screen, create a custom widget. A simple Centered CircularProgressIndicator is provided by default. | 
| emptyFolder | For an empty screen, create a custom widget. | 
| controller | For an empty screen, create a custom widget. | 
| hideHiddenEntity | Hide the files and folders that are hidden. | 
| builder | This function allows you to create custom widgets and retrieve a list of entities List<FileSystemEntity>. | 
FileManagerController
| Properties | Description | 
|---|---|
| getSortedBy | The sorting type that is currently in use is returned. | 
| setSortBy | is used to set the sorting type. SortBy{ name, type, date, size }. ie:controller.sortBy(SortBy.date) | 
| getCurrentDirectory | Get current Directory | 
| getCurrentPath | Get current path, similar to getCurrentDirectory. | 
| setCurrentPath | Set current directory path by providing Stringof path, similar toopenDirectory.List<FileSystemEntity>. | 
| isRootDirectory | return true if current directory is the root. false, if the current directory not on root of the storage. | 
| goToParentDirectory | Jumps to the parent directory of currently opened directory if the parent is accessible. | 
| openDirectory | Open directory by providing Directory. | 
| titleNotifier | ValueNotifier of the current directory's basename | 
ControlBackButton
When the current directory is not root, this widget registers a callback to prevent the user from dismissing the window, or controllers the system's back button
ie:-
  // Wrap Scaffold containing FileManage with ControlBackButton
  ControlBackButton(
    controller: controller
    child: Scaffold(
      appBar: AppBar(...)
      body: FileManager(
        ...
      )
    )
  )
Others
| Properties | Description | 
|---|---|
| isFile | check weather FileSystemEntity is File. | 
| isDirectory | check weather FileSystemEntity is Directory. | 
| basename | Get the basename of Directory or File. Provide File,DirectoryorFileSystemEntityand returns the name as aString. If you want to hide the extension of a file, you may use optional parametershowFileExtension. iecontroller.dirName(dir, true) | 
| formatBytes | Convert bytes to human readable size. getCurrentDirectory. | 
| setCurrentPath | Set current directory path by providing Stringof path, similar toopenDirectory.List<FileSystemEntity>. | 
| getFileExtension | Return file extension as String. ie:- File("/../image.png")to"png". | 
| getStorageList | Get list of available storage in the device, returns an empty list if there is no storage List<Directory> | 
| createFolder | Creates the directory if it doesn't exist. Requires currentPath and Name of the Directory. | 
 
 
 
 
Show some :heart: and :star: the repo
Project Created & Maintained By
Contributions
Contributions are welcomed!
If you feel that a hook is missing, feel free to open a pull-request.
For a custom-hook to be merged, you will need to do the following:
- 
Describe the use-case. 
- 
Open an issue explaining why we need this hook, how to use it, ... This is important as a hook will not get merged if the hook doesn't appeal to a large number of people. 
- 
If your hook is rejected, don't worry! A rejection doesn't mean that it won't be merged later in the future if more people shows an interest in it. In the mean-time, feel free to publish your hook as a package on pub.dev. 
- 
A hook will not be merged unless fully tested, to avoid breaking it inadvertently in the future.