main.dart 8,4 КБ
Newer Older
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
1
2
3
// SPDX-FileCopyrightText: Copyright 2024 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause

4-alok's avatar
4-alok включено в состав коммита
4
5
import 'dart:io';

4-alok's avatar
4-alok включено в состав коммита
6
7
8
import 'package:file_manager/file_manager.dart';
import 'package:flutter/material.dart';

Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
9
void main() => runApp(const MyApp());
4-alok's avatar
4-alok включено в состав коммита
10
11

class MyApp extends StatefulWidget {
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
12
13
  const MyApp({Key? key}) : super(key: key);

4-alok's avatar
4-alok включено в состав коммита
14
  @override
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
15
  State<MyApp> createState() => _MyAppState();
4-alok's avatar
4-alok включено в состав коммита
16
17
18
19
20
21
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
4-alok's avatar
4-alok включено в состав коммита
22
23
24
25
      debugShowCheckedModeBanner: false,
      themeMode: ThemeMode.dark,
      theme: ThemeData(useMaterial3: true),
      darkTheme: ThemeData(useMaterial3: true, brightness: Brightness.dark),
4-alok's avatar
4-alok включено в состав коммита
26
27
28
29
30
31
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
Divyanshu Shekhar's avatar
Divyanshu Shekhar включено в состав коммита
32
  final FileManagerController controller = FileManagerController();
4-alok's avatar
4-alok включено в состав коммита
33

Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
34
35
  HomePage({Key? key}) : super(key: key);

4-alok's avatar
4-alok включено в состав коммита
36
37
  @override
  Widget build(BuildContext context) {
4-alok's avatar
4-alok включено в состав коммита
38
39
    return ControlBackButton(
      controller: controller,
4-alok's avatar
4-alok включено в состав коммита
40
      child: Scaffold(
4-alok's avatar
4-alok включено в состав коммита
41
42
43
44
45
46
        appBar: appBar(context),
        body: FileManager(
          controller: controller,
          builder: (context, snapshot) {
            final List<FileSystemEntity> entities = snapshot;
            return ListView.builder(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
47
              padding: const EdgeInsets.symmetric(horizontal: 2, vertical: 0),
4-alok's avatar
4-alok включено в состав коммита
48
49
50
51
52
53
              itemCount: entities.length,
              itemBuilder: (context, index) {
                FileSystemEntity entity = entities[index];
                return Card(
                  child: ListTile(
                    leading: FileManager.isFile(entity)
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
54
55
                        ? const Icon(Icons.feed_outlined)
                        : const Icon(Icons.folder),
4-alok's avatar
4-alok включено в состав коммита
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
                    title: Text(FileManager.basename(
                      entity,
                      showFileExtension: true,
                    )),
                    subtitle: subtitle(entity),
                    onTap: () async {
                      if (FileManager.isDirectory(entity)) {
                        // open the folder
                        controller.openDirectory(entity);

                        // delete a folder
                        // await entity.delete(recursive: true);

                        // rename a folder
                        // await entity.rename("newPath");

                        // Check weather folder exists
                        // entity.exists();

                        // get date of file
                        // DateTime date = (await entity.stat()).modified;
                      } else {
                        // delete a file
                        // await entity.delete();

                        // rename a file
                        // await entity.rename("newPath");

                        // Check weather file exists
                        // entity.exists();

                        // get date of file
                        // DateTime date = (await entity.stat()).modified;

                        // get the size of the file
                        // int size = (await entity.stat()).size;
                      }
                    },
                  ),
4-alok's avatar
4-alok включено в состав коммита
95
96
                );
              },
4-alok's avatar
4-alok включено в состав коммита
97
98
99
100
101
102
103
            );
          },
        ),
        floatingActionButton: FloatingActionButton.extended(
          onPressed: () async {
            FileManager.requestFilesAccessPermission();
          },
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
104
          label: const Text("Request File Access Permission"),
4-alok's avatar
4-alok включено в состав коммита
105
106
107
108
109
110
111
112
113
114
        ),
      ),
    );
  }

  AppBar appBar(BuildContext context) {
    return AppBar(
      actions: [
        IconButton(
          onPressed: () => createFolder(context),
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
115
          icon: const Icon(Icons.create_new_folder_outlined),
4-alok's avatar
4-alok включено в состав коммита
116
117
118
        ),
        IconButton(
          onPressed: () => sort(context),
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
119
          icon: const Icon(Icons.sort_rounded),
4-alok's avatar
4-alok включено в состав коммита
120
121
122
        ),
        IconButton(
          onPressed: () => selectStorage(context),
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
123
          icon: const Icon(Icons.sd_storage_rounded),
4-alok's avatar
4-alok включено в состав коммита
124
125
126
127
128
129
130
        )
      ],
      title: ValueListenableBuilder<String>(
        valueListenable: controller.titleNotifier,
        builder: (context, title, _) => Text(title),
      ),
      leading: IconButton(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
131
        icon: const Icon(Icons.arrow_back),
4-alok's avatar
4-alok включено в состав коммита
132
133
134
135
        onPressed: () async {
          await controller.goToParentDirectory();
        },
      ),
4-alok's avatar
4-alok включено в состав коммита
136
137
    );
  }
4-alok's avatar
4-alok включено в состав коммита
138
139
140
141
142
143
144
145

  Widget subtitle(FileSystemEntity entity) {
    return FutureBuilder<FileStat>(
      future: entity.stat(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          if (entity is File) {
            int size = snapshot.data!.size;
4-alok's avatar
4-alok включено в состав коммита
146

4-alok's avatar
4-alok включено в состав коммита
147
            return Text(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
148
              FileManager.formatBytes(size),
4-alok's avatar
4-alok включено в состав коммита
149
150
151
            );
          }
          return Text(
4-alok's avatar
4-alok включено в состав коммита
152
            "${snapshot.data!.modified}".substring(0, 10),
4-alok's avatar
4-alok включено в состав коммита
153
154
          );
        } else {
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
155
          return const Text("");
4-alok's avatar
4-alok включено в состав коммита
156
157
158
159
160
        }
      },
    );
  }

4-alok's avatar
4-alok включено в состав коммита
161
162
  Future<void> selectStorage(BuildContext context) async {
    return showDialog(
4-alok's avatar
4-alok включено в состав коммита
163
164
165
      context: context,
      builder: (context) => Dialog(
        child: FutureBuilder<List<Directory>>(
4-alok's avatar
4-alok включено в состав коммита
166
          future: FileManager.getStorageList(),
4-alok's avatar
4-alok включено в состав коммита
167
168
169
170
171
172
173
174
175
176
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              final List<FileSystemEntity> storageList = snapshot.data!;
              return Padding(
                padding: const EdgeInsets.all(10.0),
                child: Column(
                    mainAxisSize: MainAxisSize.min,
                    children: storageList
                        .map((e) => ListTile(
                              title: Text(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
177
                                FileManager.basename(e),
4-alok's avatar
4-alok включено в состав коммита
178
179
180
181
182
183
184
185
186
                              ),
                              onTap: () {
                                controller.openDirectory(e);
                                Navigator.pop(context);
                              },
                            ))
                        .toList()),
              );
            }
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
187
            return const Dialog(
4-alok's avatar
4-alok включено в состав коммита
188
189
190
191
192
193
194
195
196
197
              child: CircularProgressIndicator(),
            );
          },
        ),
      ),
    );
  }

  sort(BuildContext context) async {
    showDialog(
4-alok's avatar
4-alok включено в состав коммита
198
199
200
      context: context,
      builder: (context) => Dialog(
        child: Container(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
201
          padding: const EdgeInsets.all(10),
4-alok's avatar
4-alok включено в состав коммита
202
203
204
205
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              ListTile(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
206
                  title: const Text("Name"),
4-alok's avatar
4-alok включено в состав коммита
207
                  onTap: () {
4-alok's avatar
4-alok включено в состав коммита
208
                    controller.sortBy(SortBy.name);
4-alok's avatar
4-alok включено в состав коммита
209
210
211
                    Navigator.pop(context);
                  }),
              ListTile(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
212
                  title: const Text("Size"),
4-alok's avatar
4-alok включено в состав коммита
213
                  onTap: () {
4-alok's avatar
4-alok включено в состав коммита
214
                    controller.sortBy(SortBy.size);
4-alok's avatar
4-alok включено в состав коммита
215
216
217
                    Navigator.pop(context);
                  }),
              ListTile(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
218
                  title: const Text("Date"),
4-alok's avatar
4-alok включено в состав коммита
219
                  onTap: () {
4-alok's avatar
4-alok включено в состав коммита
220
                    controller.sortBy(SortBy.date);
4-alok's avatar
4-alok включено в состав коммита
221
222
223
                    Navigator.pop(context);
                  }),
              ListTile(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
224
                  title: const Text("type"),
4-alok's avatar
4-alok включено в состав коммита
225
                  onTap: () {
4-alok's avatar
4-alok включено в состав коммита
226
                    controller.sortBy(SortBy.type);
4-alok's avatar
4-alok включено в состав коммита
227
228
229
230
231
232
233
234
235
236
237
238
                    Navigator.pop(context);
                  }),
            ],
          ),
        ),
      ),
    );
  }

  createFolder(BuildContext context) async {
    showDialog(
      context: context,
4-alok's avatar
4-alok включено в состав коммита
239
240
241
242
      builder: (context) {
        TextEditingController folderName = TextEditingController();
        return Dialog(
          child: Container(
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
243
            padding: const EdgeInsets.all(10),
4-alok's avatar
4-alok включено в состав коммита
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                ListTile(
                  title: TextField(
                    controller: folderName,
                  ),
                ),
                ElevatedButton(
                  onPressed: () async {
                    try {
                      // Create Folder
                      await FileManager.createFolder(
                          controller.getCurrentPath, folderName.text);
                      // Open Created Folder
                      controller.setCurrentPath =
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
260
261
262
263
264
265
266
                          "${controller.getCurrentPath}/${folderName.text}";
                    } catch (e) {
                      debugPrint('Error: $e');
                    }
                    if (context.mounted) {
                      Navigator.pop(context);
                    }
4-alok's avatar
4-alok включено в состав коммита
267
                  },
Minkail Taisunov's avatar
Minkail Taisunov включено в состав коммита
268
                  child: const Text('Create Folder'),
4-alok's avatar
4-alok включено в состав коммита
269
270
271
                )
              ],
            ),
4-alok's avatar
4-alok включено в состав коммита
272
          ),
4-alok's avatar
4-alok включено в состав коммита
273
274
        );
      },
4-alok's avatar
4-alok включено в состав коммита
275
    );
4-alok's avatar
4-alok включено в состав коммита
276
  }
4-alok's avatar
4-alok включено в состав коммита
277
}