import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
// ignore: must_be_immutable
class TreeView extends StatefulWidget {
// ignore: non_constant_identifier_names
List<TreeViewItem> Items = <TreeViewItem>[];
// ignore: non_constant_identifier_names
TreeView({this.Items});
@override _TreeView createState() => _TreeView();
}
class _TreeView extends State<TreeView> {
// ignore: non_constant_identifier_names
List<TreeViewItem> Items = <TreeViewItem>[];
int _selectedIndex;
// ignore: non_constant_identifier_names
void AddInItems(List<TreeViewItem> items, int level) {
items.forEach((element) {
element._level = level;
Items.add(element);
AddInItems(element._Items, element._level + 1);
});
}
@override void initState() {
// TODO: implement initState
super.initState();
AddInItems(widget.Items, 0);
}
@override Widget build(BuildContext context) {
return ListView.builder(
padding:
EdgeInsets.zero,
itemBuilder: (context, index) {
TreeViewItem item = Items[index];
if (item.IsExpanded == true && item._IsVisible == true) {
item._Items.forEach((element) {
element._IsVisible = true;
});
} else {
item._Items.forEach((element) {
element._IsVisible = false;
});
}
return Padding(
padding: EdgeInsets.only(
left: item._level * 17.0,
),
child: Visibility(
child: ListTile(
leading: Align(
child: Padding(
padding: EdgeInsets.only(left: 30),
child: item._Items.length > 0
? item.IsExpanded
? Transform.rotate(
alignment: Alignment(-0.2, 0.3),
angle: 0.8,
child: Icon(Icons.arrow_forward_ios),
)
: Icon(Icons.arrow_forward_ios)
: Text("")),
alignment:
Alignment.center,
widthFactor: 0,
),
title: Text(item.Header),
onTap: () {
setState(() {
item.IsExpanded = !item.IsExpanded;
_selectedIndex = index;
});
},
selectedTileColor: Colors.black12,
selected: index == _selectedIndex,
),
visible: item._IsVisible,
),
);
},
itemCount: Items.length,
);
}
}
class TreeViewItem {
String Header;
List<TreeViewItem> _Items = new List<TreeViewItem>();
bool IsExpanded = false; // ignore: non_constant_identifier_names
bool _IsVisible; // ignore: non_constant_identifier_names, unused_field
int _level;
TreeViewItem _Parent = null;
// ignore: non_constant_identifier_names
TreeViewItem(String Header) {
this.Header = Header;
this._IsVisible = true;
this._level = 0;
}
// ignore: non_constant_identifier_names
void Add(TreeViewItem Item) {
Item._IsVisible = false;
Item._Parent = this;
_Items.add(Item);
}
// ignore: non_constant_identifier_names
TreeViewItem ElementAt(int index) {
return _Items.elementAt(index);
}
}