A Dart virtualition library.
import 'dart:html';
import 'package:react/react_dom.dart' as react_dom;
import 'package:over_react/over_react.dart';
import 'package:virtual/virtual.dart';
void main() {
setClientConfiguration();
var content = (VirtualList()
..itemSize = new Size.autoWidth(34)
..scrollDirection = ScrollDirection.vertical
..height = '500px'
..width = 'auto'
..overscanCount = 100
..itemCount = 10000
..itemRenderer = (index, isScrolling) {
return Dom.div()(isScrolling ? 'Loading...' : 'Item $index');
}
)();
react_dom.render(content, querySelector('#output'));
}
Name | Type | Required | Default Value | Description |
---|---|---|---|---|
itemSizes |
ItemSizeCollection |
Yes | - | The collection of item sizes. |
itemRenderer |
ItemRenderer |
Yes | - | Returns a ReactElement given it's index and whether the list is currently scrolling. |
See more props here.
Name | Description |
---|---|
scrollToOffset(int offset) |
Scroll the list to the specified offset. |
recomputeSizes([int startIndex = 0]) |
Recompute the calculated sizes from the specificed index. |
import 'dart:html';
import 'package:react/react_dom.dart' as react_dom;
import 'package:over_react/over_react.dart';
import 'package:virtual/virtual.dart';
import 'node.dart' as tree;
void main() {
setClientConfiguration();
var content = (VirtualTree()
..scrollDirection = ScrollDirection.vertical
..height = '500px'
..width = 'auto'
..overscanCount = 100
..root = makeTree()
..nodeRenderer = (index, isScrolling, node) {
return (tree.Node()
..isScrolling = isScrolling
..key = index
..index = index
..node = node
)();
}
)();
react_dom.render(content, querySelector('#output'));
}
Name | Type | Required | Default Value | Description |
---|---|---|---|---|
root |
TreeNode |
Yes | - | The backing tree node structure of the virtual tree. |
nodeRenderer |
NodeRenderer |
Yes | - | Returns a ReactElement given it's index, whether the list is currently scrolling, and the backing TreeNode . |
See more props here.
Name | Description |
---|---|
primitiveRef |
VirtualListComponent. |
recomputeSizes([int startIndex = 0]) |
Recompute the calculated sizes from the specificed index. |
Name | Type | Required | Description |
---|---|---|---|
height |
dynamic |
Yes | - |
width |
dynamic |
Yes | - |
scrollDirection |
ScrollDirection |
Yes | - |
overscanCount |
int |
No | 0 |
onItemsRendered |
ItemScrolledCalback |
No | - |
onListScroll |
ListScrollCalback |
No | - |
Base props/component classes to help create components that render TreeNode
s.
import 'package:meta/meta.dart';
import 'package:over_react/over_react.dart';
import 'package:virtual/virtual.dart';
@Factory()
UiFactory<NodeProps> Node;
@Props()
class NodeProps extends UiProps with BaseTreeNodePropsMixin {}
@Component()
class NodeComponent extends UiComponent<NodeProps> with BaseTreeNodeMixin<NodeProps> {
String get expanderText => props.node.isCollapsed ? 'Expand' : 'Collapse';
@override
Map getDefaultProps() => (newProps()
..addProps(BaseTreeNodePropsMixin.defaultProps)
);
@override
@mustCallSuper
void componentWillMount() {
super.componentWillMount();
bindSub();
}
@override
@mustCallSuper
void componentWillUnmount() {
super.componentWillUnmount();
unbindSub();
}
@override
render() {
var style = <String, dynamic>{}
..['paddingLeft'] = props.node.depth * 28
..['height'] = '100%';
var children = [];
if (props.isScrolling) {
children.add('Loading');
} else {
children.addAll([
props.node.content,
_renderToggleButton(),
_renderToggleAllButton(),
]);
}
return (Dom.div()
..style = style
)(children);
}
ReactElement _renderToggleButton() {
if (props.node.isLeaf) return null;
return (Dom.button()
..onClick = _handleExpansionToggleClick
..key = 'toggle'
)(expanderText);
}
ReactElement _renderToggleAllButton() {
if (props.node.isLeaf) return null;
return (Dom.button()
..onClick = _handleExpansionAllToggleClick
..key = 'toggle all'
)('$expanderText all');
}
void _handleExpansionAllToggleClick(_) {
toggle(all: true);
}
void _handleExpansionToggleClick(_) {
toggle();
}
}
Name | Type | Required | Default Value | Description |
---|---|---|---|---|
node |
TreeNode |
Yes | - | The backing TreeNode of this component. |
index |
int |
Yes | - | The index of this component. |
isScrolling |
bool |
No | false |
Whether the component is being scrolled. |
Name | Description |
---|---|
expand({bool all = false}) |
Expand the backing TreeNode , optionally expand all child nodes. |
collapse({bool all = false}) |
Collapse the backing TreeNode , optionally collapse all child nodes. |
toggle({bool all = false}) |
Toggle the expanded state of the backing TreeNode , optionally toggle all child nodes. |
This library's VirtualList
is a Dart port of react-tiny-virtual-list's VirtualList
, with some added features. And the VirtualTree
renders the said VirtualList
.