README.md 7,6 КБ
Newer Older
4-alok's avatar
4-alok включено в состав коммита
1
# File Manager
4-alok's avatar
4-alok включено в состав коммита
2

4-alok's avatar
4-alok включено в состав коммита
3
![FileManager](https://i.imgur.com/NNaUK60.png)
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
4

4-alok's avatar
4-alok включено в состав коммита
5
![GitHub](https://img.shields.io/github/license/DevsOnFlutter/file_manager?style=plastic) ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/DevsOnFlutter/file_manager?style=plastic) ![GitHub top language](https://img.shields.io/github/languages/top/DevsOnFlutter/file_manager?style=plastic) ![GitHub language count](https://img.shields.io/github/languages/count/DevsOnFlutter/file_manager?style=plastic) ![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/DevsOnFlutter/file_manager?style=plastic) ![GitHub issues](https://img.shields.io/github/issues/DevsOnFlutter/file_manager?style=plastic)
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
6

4-alok's avatar
4-alok включено в состав коммита
7
FileManager is a wonderful widget that allows you to manage files and folders, pick files and folders, and do a lot more.
4-alok's avatar
4-alok включено в состав коммита
8
Designed to feel like part of the Flutter framework.
4-alok's avatar
4-alok включено в состав коммита
9

4-alok's avatar
4-alok включено в состав коммита
10
## Compatibility
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
11
12
13

&nbsp; Android </br>
&nbsp; Linux </br>
4-alok's avatar
4-alok включено в состав коммита
14
15
&nbsp; Windows ([in progress](https://github.com/4-alok/file_manager/tree/windows-support))</br>
&nbsp; Web </br>
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
16
&nbsp; MacOS (active issue: [MacOS support](https://github.com/DevsOnFlutter/file_manager/issues/8)) </br>
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
17
&nbsp; iOS (active issue: [iOS support](https://github.com/DevsOnFlutter/file_manager/issues/7)) </br>
4-alok's avatar
4-alok включено в состав коммита
18

4-alok's avatar
4-alok включено в состав коммита
19
## Usage
4-alok's avatar
4-alok включено в состав коммита
20

4-alok's avatar
4-alok включено в состав коммита
21
22
23
24
Make sure to check out [examples](https://github.com/DevsOnFlutter/file_manager/blob/main/example/lib/main.dart) for more details.

### Installation

4-alok's avatar
4-alok включено в состав коммита
25
26
27
28
29
30
31
32
**Dependencies** Add the following line to `pubspec.yaml`:

```yaml
dependencies:
  file_manager: ^1.0.0
```

### Give storage permission to application
4-alok's avatar
4-alok включено в состав коммита
33

4-alok's avatar
4-alok включено в состав коммита
34
**Android:** Beside needing to add **WRITE_EXTERNAL_STORAGE** and **READ_EXTERNAL_STORAGE** to your android/app/src/main/AndroidManifest.xml.
4-alok's avatar
4-alok включено в состав коммита
35
36
37
38
39
40
41
42
43

```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"/>
...
</manifest>
```
4-alok's avatar
4-alok включено в состав коммита
44

Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
45
also add for Android 10
4-alok's avatar
4-alok включено в состав коммита
46
47

```xml
4-alok's avatar
4-alok включено в состав коммита
48
49
50
51
52
53
54
55
    <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`](https://pub.dev/packages/permission_handler).

4-alok's avatar
4-alok включено в состав коммита
56
57
</hr>

4-alok's avatar
4-alok включено в состав коммита
58
59
### Basic setup

Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
60
*The complete example is available [here](https://github.com/DevsOnFlutter/file_manager/blob/main/example/lib/main.dart).*
4-alok's avatar
4-alok включено в состав коммита
61
62

Required parameter for **FileManager** are `controller` and `builder`
4-alok's avatar
4-alok включено в состав коммита
63

4-alok's avatar
4-alok включено в состав коммита
64
* `controller` The 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.
4-alok's avatar
4-alok включено в состав коммита
65
66

```dart
4-alok's avatar
4-alok включено в состав коммита
67
68
69
final FileManagerController controller = FileManagerController();
```

4-alok's avatar
4-alok включено в состав коммита
70
* `builder` This function allows you to create custom widgets and retrieve a list of entities `List<FileSystemEntity>.`
4-alok's avatar
4-alok включено в состав коммита
71

4-alok's avatar
4-alok включено в состав коммита
72
## Sample code
4-alok's avatar
4-alok включено в состав коммита
73
74
75
76
77

```dart
FileManager(
    controller: controller,
    builder: (context, snapshot) {
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
78
    final List<FileSystemEntity> entities = snapshot;
4-alok's avatar
4-alok включено в состав коммита
79
      return ListView.builder(
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
80
        itemCount: entities.length,
4-alok's avatar
4-alok включено в состав коммита
81
82
83
        itemBuilder: (context, index) {
          return Card(
            child: ListTile(
4-alok's avatar
4-alok включено в состав коммита
84
              leading: FileManager.isFile(entities[index])
4-alok's avatar
4-alok включено в состав коммита
85
86
                  ? Icon(Icons.feed_outlined)
                  : Icon(Icons.folder),
4-alok's avatar
4-alok включено в состав коммита
87
              title: Text(FileManager.basename(entities[index])),
4-alok's avatar
4-alok включено в состав коммита
88
              onTap: () {
4-alok's avatar
4-alok включено в состав коммита
89
                if (FileManager.isDirectory(entities[index])) {
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
90
                    controller.openDirectory(entities[index]);   // open directory
4-alok's avatar
4-alok включено в состав коммита
91
92
93
94
95
96
97
98
99
100
101
102
                  } else {
                      // Perform file-related tasks.
                  }
              },
            ),
          );
        },
      );
  },
),
```

4-alok's avatar
4-alok включено в состав коммита
103
104
</hr>

4-alok's avatar
4-alok включено в состав коммита
105
## FileManager
4-alok's avatar
4-alok включено в состав коммита
106

4-alok's avatar
4-alok включено в состав коммита
107
108
109
110
111
112
113
114
115
|  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>.` |

## FileManagerContoller
4-alok's avatar
4-alok включено в состав коммита
116

4-alok's avatar
4-alok включено в состав коммита
117
118
119
120
121
122
123
|  Properties  |   Description   |
|--------------|-----------------|
| `getSortedBy` | The sorting type that is currently in use is returned. |
| `setSortedBy` | is used to set the sorting type. `SortBy{ name, type, date, size }`. |
| `getCurrentDirectory` | Get current Directory |
| `getCurrentPath` | Get current path, similar to [getCurrentDirectory]. |
| `setCurrentPath` | Set current directory path by providing `String` of path, similar to [openDirectory]. `List<FileSystemEntity>.` |
4-alok's avatar
4-alok включено в состав коммита
124
125
| `isRootDirectory` | return true if current directory is the root. false, if the current directory not on root of the stogare. |
| `goToParentDirectory` | Jumps to the parent directory of currently opened directory if the parent is accessible. |
4-alok's avatar
4-alok включено в состав коммита
126
| `openDirectory` | Open directory by providing `Directory`. |
4-alok's avatar
4-alok включено в состав коммита
127
| `titleNotifier` | ValueNotifier of the current directory's basename |
4-alok's avatar
4-alok включено в состав коммита
128

Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
129
## Others
4-alok's avatar
4-alok включено в состав коммита
130

4-alok's avatar
4-alok включено в состав коммита
131
132
133
134
|  Properties  |   Description   |
|--------------|-----------------|
| `isFile` | check weather FileSystemEntity is File. |
| `isDirectory` | check weather FileSystemEntity is Directory. |
4-alok's avatar
4-alok включено в состав коммита
135
| `basename` | Get the basename of Directory or File. Provide `File`, `Directory` or `FileSystemEntity` and returns the name as a `String`. If you want to hide the extension of a file, you may use optional parameter `showFileExtension`. ie ```controller.dirName(dir, true)```|
4-alok's avatar
4-alok включено в состав коммита
136
137
138
| `formatBytes` | Convert bytes to human readable size.[getCurrentDirectory]. |
| `setCurrentPath` | Set current directory path by providing `String` of path, similar to [openDirectory]. `List<FileSystemEntity>.` |
| `getStorageList` | Get list of available storage in the device, returns an empty list if there is no storage `List<Directory>`|
4-alok's avatar
4-alok включено в состав коммита
139
| `createFolder` | Creates the directory if it doesn't exist. Requires currentPath and Name of the Directory. |
4-alok's avatar
4-alok включено в состав коммита
140

4-alok's avatar
4-alok включено в состав коммита
141
</hr>
4-alok's avatar
4-alok включено в состав коммита
142
<p>
4-alok's avatar
4-alok включено в состав коммита
143

4-alok's avatar
4-alok включено в состав коммита
144
145
146
147
<img width="205px" height ="444px" alt="Example" src="https://imgur.com/RXwvwB9.gif"/>
<img width="205px" height ="444px" alt="Example" src="https://imgur.com/a56XQv7.png"/>
<img width="205px" height ="444px" alt="Example" src="https://imgur.com/q4Ouf3M.png"/>
<img width="205px" height ="444px" alt="Example" src="https://imgur.com/CwB5wb0.png"/>
4-alok's avatar
4-alok включено в состав коммита
148

4-alok's avatar
4-alok включено в состав коммита
149
</p>
4-alok's avatar
4-alok включено в состав коммита
150
151
</hr>

4-alok's avatar
4-alok включено в состав коммита
152
153
## Show some :heart: and :star: the repo

4-alok's avatar
4-alok включено в состав коммита
154
155
156
157
![GitHub Repo stars](https://img.shields.io/github/stars/DevsOnFlutter/file_manager?style=social)
![GitHub forks](https://img.shields.io/github/forks/DevsOnFlutter/file_manager?style=social)
[![GitHub followers](https://img.shields.io/github/followers/4-alok?style=social)](https://github.com/4-alok/)

Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
158
159
## Project Created & Maintained By

4-alok's avatar
4-alok включено в состав коммита
160
161
* ### [DevsOnFlutter](https://github.com/DevsOnFlutter)

4-alok's avatar
4-alok включено в состав коммита
162
</hr>
4-alok's avatar
4-alok включено в состав коммита
163
164
165
166
167
168
169
170
171

## 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:

4-alok's avatar
4-alok включено в состав коммита
172
* Describe the use-case.
4-alok's avatar
4-alok включено в состав коммита
173

4-alok's avatar
4-alok включено в состав коммита
174
* Open an issue explaining why we need this hook, how to use it, ...
4-alok's avatar
4-alok включено в состав коммита
175
176
177
  This is important as a hook will not get merged if the hook doens't appeal to
  a large number of people.

4-alok's avatar
4-alok включено в состав коммита
178
* If your hook is rejected, don't worry! A rejection doesn't mean that it won't
4-alok's avatar
4-alok включено в состав коммита
179
  be merged later in the future if more people shows an interest in it.
4-alok's avatar
4-alok включено в состав коммита
180
  In the mean-time, feel free to publish your hook as a package on <https://pub.dev>.
4-alok's avatar
4-alok включено в состав коммита
181

4-alok's avatar
4-alok включено в состав коммита
182
* A hook will not be merged unles fully tested, to avoid breaking it inadvertendly
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
183
  in the future.