file_manager 1.0.2 file_manager: ^1.0.2 copied to clipboard
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.
import 'dart:io';
import 'package:file_manager/file_manager.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
themeMode: ThemeMode.dark,
theme: ThemeData(useMaterial3: true),
darkTheme: ThemeData(useMaterial3: true, brightness: Brightness.dark),
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
final FileManagerController controller = FileManagerController();
@override
Widget build(BuildContext context) {
return ControlBackButton(
controller: controller,
child: Scaffold(
appBar: appBar(context),
body: FileManager(
controller: controller,
builder: (context, snapshot) {
final List<FileSystemEntity> entities = snapshot;
return ListView.builder(
padding: EdgeInsets.symmetric(horizontal: 2, vertical: 0),
itemCount: entities.length,
itemBuilder: (context, index) {
FileSystemEntity entity = entities[index];
return Card(
child: ListTile(
leading: FileManager.isFile(entity)
? Icon(Icons.feed_outlined)
: Icon(Icons.folder),
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;
}
},
),
);
},
);
},
),
floatingActionButton: FloatingActionButton.extended(
onPressed: () async {
FileManager.requestFilesAccessPermission();
},
label: Text("Request File Access Permission"),
),
),
);
}
AppBar appBar(BuildContext context) {
return AppBar(
actions: [
IconButton(
onPressed: () => createFolder(context),
icon: Icon(Icons.create_new_folder_outlined),
),
IconButton(
onPressed: () => sort(context),
icon: Icon(Icons.sort_rounded),
),
IconButton(
onPressed: () => selectStorage(context),
icon: Icon(Icons.sd_storage_rounded),
)
],
title: ValueListenableBuilder<String>(
valueListenable: controller.titleNotifier,
builder: (context, title, _) => Text(title),
),
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () async {
await controller.goToParentDirectory();
},
),
);
}
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;
return Text(
"${FileManager.formatBytes(size)}",
);
}
return Text(
"${snapshot.data!.modified}".substring(0, 10),
);
} else {
return Text("");
}
},
);
}
Future<void> selectStorage(BuildContext context) async {
return showDialog(
context: context,
builder: (context) => Dialog(
child: FutureBuilder<List<Directory>>(
future: FileManager.getStorageList(),
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(
"${FileManager.basename(e)}",
),
onTap: () {
controller.openDirectory(e);
Navigator.pop(context);
},
))
.toList()),
);
}
return Dialog(
child: CircularProgressIndicator(),
);
},
),
),
);
}
sort(BuildContext context) async {
showDialog(
context: context,
builder: (context) => Dialog(
child: Container(
padding: EdgeInsets.all(10),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
title: Text("Name"),
onTap: () {
controller.sortBy(SortBy.name);
Navigator.pop(context);
}),
ListTile(
title: Text("Size"),
onTap: () {
controller.sortBy(SortBy.size);
Navigator.pop(context);
}),
ListTile(
title: Text("Date"),
onTap: () {
controller.sortBy(SortBy.date);
Navigator.pop(context);
}),
ListTile(
title: Text("type"),
onTap: () {
controller.sortBy(SortBy.type);
Navigator.pop(context);
}),
],
),
),
),
);
}
createFolder(BuildContext context) async {
showDialog(
context: context,
builder: (context) {
TextEditingController folderName = TextEditingController();
return Dialog(
child: Container(
padding: EdgeInsets.all(10),
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 =
controller.getCurrentPath + "/" + folderName.text;
} catch (e) {}
Navigator.pop(context);
},
child: Text('Create Folder'),
)
],
),
),
);
},
);
}
}