Skip to content

Instantly share code, notes, and snippets.

@IsmailAlamKhan
Last active June 27, 2022 20:08
Show Gist options
  • Save IsmailAlamKhan/e796b98082bea753ec071ce52e1e8d72 to your computer and use it in GitHub Desktop.
Save IsmailAlamKhan/e796b98082bea753ec071ce52e1e8d72 to your computer and use it in GitHub Desktop.
Get a tree view of the dir you provide or the current dir you are in.
/// Used package https://pub.dev/packages/flutter_simple_treeview
/// and https://pub.dev/packages/url_launcher to open the file
class FileTreeItem {
final String name;
final String path;
final List<FileTreeItem>? children;
FileTreeItem({required this.name, this.children, required this.path});
}
List<FileTreeItem> getFileTreeDir([Directory? dir]) {
final separator = Platform.pathSeparator;
dir ??= Directory.current;
final dirList = dir.listSync();
return dirList.map((FileSystemEntity entity) {
final path = entity.path;
final name = path.split(separator).last;
if (entity is Directory) {
return FileTreeItem(name: name, children: getFileTreeDir(entity), path: path);
} else {
return FileTreeItem(name: name, path: path);
}
}).toList();
}
class TreeFromJson extends StatefulWidget {
const TreeFromJson({super.key});
@override
_TreeFromJsonState createState() => _TreeFromJsonState();
}
class _TreeFromJsonState extends State<TreeFromJson> {
final TreeController _treeController = TreeController(allNodesExpanded: false);
final tree = getFileTreeDir();
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: TreeView(
nodes: toTreeNodes(tree),
treeController: _treeController,
),
);
}
List<TreeNode> toTreeNodes(List<FileTreeItem> tree) {
List<TreeNode> nodes = [];
for (var treeItem in tree) {
final key = ObjectKey(treeItem.name);
if (treeItem.children != null) {
nodes.add(
TreeNode(
key: key,
content: InkWell(
onTap: () => setState(() => _treeController.toggleNodeExpanded(key)),
child: Center(child: Text(treeItem.name)),
),
children: toTreeNodes(treeItem.children!),
),
);
} else {
nodes.add(
TreeNode(
key: key,
content: InkWell(
onTap: () => launchUrlString(treeItem.path),
child: Center(child: Text(treeItem.name)),
),
),
);
}
}
nodes.sort((a, b) => a.children?.isNotEmpty ?? false ? -1 : 1);
return nodes;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment