Last active
June 27, 2022 20:08
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// 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