Коммит e517c7de создал по автору 4-alok's avatar 4-alok
Просмотр файлов

added SortBy.type in SortBy

владелец 32b98a70
......@@ -48,7 +48,6 @@ class HomePage extends StatelessWidget {
body: Container(
margin: EdgeInsets.all(10),
child: FileManager(
sort: SortBy.date,
controller: controller,
tileBuilder: (context, entity) {
return Card(
......
......@@ -5,7 +5,15 @@ import 'package:flutter/material.dart';
class FileManagerController extends ChangeNotifier {
String _path = "";
int _currentStorage = 0;
SortBy short = SortBy.name;
SortBy _short = SortBy.name;
// TODO: [Documentation]
SortBy get getSortedBy => _short;
// TODO: [Documentation]
set setSortedBy(SortBy sortType) {
_short = sortType;
notifyListeners();
}
/// Get current directory path.
Directory get getCurrentDirectory => Directory(_path);
......
......@@ -8,30 +8,19 @@ import 'package:path_provider/path_provider.dart';
import 'package:file_manager/helper/helper.dart';
export 'package:file_manager/helper/helper.dart';
typedef TileBuilder = Widget Function(
typedef _TileBuilder = Widget Function(
BuildContext context,
FileSystemEntity entity,
);
class _PathStat {
final String path;
final FileStat fileStat;
final DateTime fileStat;
_PathStat(this.path, this.fileStat);
}
List<_PathStat> _pathStat = [];
bool isFile(FileSystemEntity entity) {
return (entity is File);
}
bool isDirectory(FileSystemEntity entity) {
return (entity is Directory);
}
Future<List<FileSystemEntity>> _sortEntitysList(
String path, SortBy sortType) async {
_pathStat.clear();
final List<FileSystemEntity> list = await Directory(path).list().toList();
if (sortType == SortBy.name) {
final dirs = list.where((element) => element is Directory).toList();
......@@ -40,17 +29,36 @@ Future<List<FileSystemEntity>> _sortEntitysList(
files.sort((a, b) => a.path.toLowerCase().compareTo(b.path.toLowerCase()));
return [...dirs, ...files];
} else if (sortType == SortBy.date) {
List<_PathStat> _pathStat = [];
for (FileSystemEntity e in list) {
_pathStat.add(_PathStat(e.path, (await e.stat())));
_pathStat.add(_PathStat(e.path, (await e.stat()).modified));
}
list.sort((a, b) => _pathStat
.indexWhere((element) => element.path == a.path)
.compareTo(_pathStat.indexWhere((element) => element.path == b.path)));
return list;
} else if (sortType == SortBy.type) {
final dirs = list.where((element) => element is Directory).toList();
dirs.sort((a, b) => a.path.toLowerCase().compareTo(b.path.toLowerCase()));
final files = list.where((element) => element is File).toList();
files.sort((a, b) => a.path
.toLowerCase()
.split('.')
.last
.compareTo(b.path.toLowerCase().split('.').last));
return [...dirs, ...files];
}
return [];
}
bool isFile(FileSystemEntity entity) {
return (entity is File);
}
bool isDirectory(FileSystemEntity entity) {
return (entity is Directory);
}
/// Get the basename of Directory or File.
/// ie: controller.dirName(dir);
String basename(dynamic entity, [bool showFileExtension = true]) {
......@@ -87,8 +95,7 @@ class FileManager extends StatefulWidget {
final ScrollPhysics? physics;
final bool shrinkWrap;
final FileManagerController controller;
final SortBy sort;
final TileBuilder tileBuilder;
final _TileBuilder tileBuilder;
/// Hide the hidden file and folder.
final bool hideHiddenEntity;
......@@ -97,7 +104,6 @@ class FileManager extends StatefulWidget {
this.loadingScreen,
this.physics,
this.shrinkWrap = false,
this.sort = SortBy.name,
required this.controller,
required this.tileBuilder,
this.hideHiddenEntity = true,
......@@ -109,12 +115,15 @@ class FileManager extends StatefulWidget {
class _FileManagerState extends State<FileManager> {
final ValueNotifier<String> path = ValueNotifier<String>("");
final ValueNotifier<SortBy> sort = ValueNotifier<SortBy>(SortBy.name);
@override
void initState() {
super.initState();
widget.controller
.addListener(() => path.value = widget.controller.getCurrentPath);
widget.controller.addListener(() {
path.value = widget.controller.getCurrentPath;
sort.value = widget.controller.getSortedBy;
});
}
@override
......@@ -124,12 +133,9 @@ class _FileManagerState extends State<FileManager> {
builder: (context, snapshot) {
if (snapshot.hasData) {
widget.controller.setCurrentPath = snapshot.data![0].path;
// path.value = snapshot.data![0].path;
return body(context);
} else if (snapshot.hasError) {
// print(snapshot.error);
throw Exception(snapshot.error.toString());
// return errorPage(snapshot.error.toString());
} else {
return loadingScreenWidget();
}
......@@ -141,47 +147,44 @@ class _FileManagerState extends State<FileManager> {
return ValueListenableBuilder<String>(
valueListenable: path,
builder: (context, pathSnapshot, _) {
return FutureBuilder<List<FileSystemEntity>>(
// future: Directory(pathSnapshot).list(recursive: false).toList(),
future: _sortEntitysList(pathSnapshot, widget.sort),
builder: (context, snapshot) {
if (snapshot.hasData) {
List<FileSystemEntity> entitys = snapshot.data!;
if (widget.hideHiddenEntity) {
entitys = entitys.where((element) {
if (basename(element) == "" ||
basename(element).startsWith('.')) {
return false;
return ValueListenableBuilder<SortBy>(
valueListenable: sort,
builder: (context, snapshot, _) {
return FutureBuilder<List<FileSystemEntity>>(
future: _sortEntitysList(pathSnapshot, sort.value),
builder: (context, snapshot) {
if (snapshot.hasData) {
List<FileSystemEntity> entitys = snapshot.data!;
if (widget.hideHiddenEntity) {
entitys = entitys.where((element) {
if (basename(element) == "" ||
basename(element).startsWith('.')) {
return false;
} else {
return true;
}
}).toList();
}
return ListView.builder(
physics: widget.physics,
shrinkWrap: widget.shrinkWrap,
itemCount: entitys.length,
itemBuilder: (context, index) {
return widget.tileBuilder(context, entitys[index]);
},
); // TODO: [Documentation]
} else if (snapshot.hasError) {
print(snapshot.error);
return errorPage(snapshot.error.toString());
} else {
return true;
return loadingScreenWidget();
}
}).toList();
}
return ListView.builder(
physics: widget.physics,
shrinkWrap: widget.shrinkWrap,
itemCount: entitys.length,
itemBuilder: (context, index) {
return widget.tileBuilder(context, entitys[index]);
},
);
} else if (snapshot.hasError) {
print(snapshot.error);
return errorPage(snapshot.error.toString());
} else {
return loadingScreenWidget();
}
});
});
},
);
}
// Widget tileWidget(BuildContext context, FileSystemEntity entity) {
// return widget.tileBuilder(context, entity);
// }
Container errorPage(String error) {
return Container(
color: Colors.red,
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать