diff --git a/packages/two_dimensional_scrollables/CHANGELOG.md b/packages/two_dimensional_scrollables/CHANGELOG.md index 02fedb16e7e..0bcac837523 100644 --- a/packages/two_dimensional_scrollables/CHANGELOG.md +++ b/packages/two_dimensional_scrollables/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.1 + +* Adds generics to the callbacks and builders of TreeView. + ## 0.3.0 * Adds new TreeView widget and associated classes. diff --git a/packages/two_dimensional_scrollables/example/lib/tree_view/custom_tree.dart b/packages/two_dimensional_scrollables/example/lib/tree_view/custom_tree.dart index 2cbaf041778..cbca2fb35dd 100644 --- a/packages/two_dimensional_scrollables/example/lib/tree_view/custom_tree.dart +++ b/packages/two_dimensional_scrollables/example/lib/tree_view/custom_tree.dart @@ -105,7 +105,7 @@ class CustomTreeExampleState extends State { Widget _treeNodeBuilder( BuildContext context, - TreeViewNode node, + TreeViewNode node, AnimationStyle toggleAnimationStyle, ) { final bool isParentNode = node.children.isNotEmpty; @@ -144,7 +144,7 @@ class CustomTreeExampleState extends State { // Spacer const SizedBox(width: 8.0), // Content - Text(node.content.toString()), + Text(node.content), ], ); } @@ -188,14 +188,14 @@ class CustomTreeExampleState extends State { controller: _horizontalController, ), tree: _tree, - onNodeToggle: (TreeViewNode node) { + onNodeToggle: (TreeViewNode node) { setState(() { - _selectedNode = node as TreeViewNode; + _selectedNode = node; }); }, treeNodeBuilder: _treeNodeBuilder, - treeRowBuilder: (TreeViewNode node) { - if (_selectedNode == (node as TreeViewNode)) { + treeRowBuilder: (TreeViewNode node) { + if (_selectedNode == node) { return TreeRow( extent: FixedTreeRowExtent( node.children.isNotEmpty ? 60.0 : 50.0, diff --git a/packages/two_dimensional_scrollables/example/lib/tree_view/simple_tree.dart b/packages/two_dimensional_scrollables/example/lib/tree_view/simple_tree.dart index bb6c6767308..c5e0fe85a8c 100644 --- a/packages/two_dimensional_scrollables/example/lib/tree_view/simple_tree.dart +++ b/packages/two_dimensional_scrollables/example/lib/tree_view/simple_tree.dart @@ -100,13 +100,13 @@ class TreeExampleState extends State { controller: horizontalController, ), tree: _tree, - onNodeToggle: (TreeViewNode node) { + onNodeToggle: (TreeViewNode node) { setState(() { - _selectedNode = node as TreeViewNode; + _selectedNode = node; }); }, - treeRowBuilder: (TreeViewNode node) { - if (_selectedNode == (node as TreeViewNode)) { + treeRowBuilder: (TreeViewNode node) { + if (_selectedNode == node) { return TreeView.defaultTreeRowBuilder(node).copyWith( recognizerFactories: _getTapRecognizer(node), backgroundDecoration: TreeRowDecoration( diff --git a/packages/two_dimensional_scrollables/lib/src/tree_view/tree.dart b/packages/two_dimensional_scrollables/lib/src/tree_view/tree.dart index 33257e1e7b1..ba6c4632c40 100644 --- a/packages/two_dimensional_scrollables/lib/src/tree_view/tree.dart +++ b/packages/two_dimensional_scrollables/lib/src/tree_view/tree.dart @@ -338,14 +338,14 @@ class TreeView extends StatefulWidget { /// /// By default, if this is unset, the [TreeView.defaultTreeNodeBuilder] is /// used. - final TreeViewNodeBuilder treeNodeBuilder; + final TreeViewNodeBuilder treeNodeBuilder; /// Builds the [TreeRow] that describes the row for the provided /// [TreeViewNode]. /// /// By default, if this is unset, the [TreeView.defaultTreeRowBuilder] /// is used. - final TreeViewRowBuilder treeRowBuilder; + final TreeViewRowBuilder treeRowBuilder; /// If provided, the controller can be used to expand and collapse /// [TreeViewNode]s, or lookup information about the current state of the @@ -360,7 +360,7 @@ class TreeView extends StatefulWidget { /// a result of being toggled. /// /// This will not be called if a [TreeViewNode] does not have any children. - final TreeViewNodeCallback? onNodeToggle; + final TreeViewNodeCallback? onNodeToggle; /// The default [AnimationStyle] for expanding and collapsing nodes in the /// [TreeView]. diff --git a/packages/two_dimensional_scrollables/lib/src/tree_view/tree_core.dart b/packages/two_dimensional_scrollables/lib/src/tree_view/tree_core.dart index f853cd88e28..2c4caea45e3 100644 --- a/packages/two_dimensional_scrollables/lib/src/tree_view/tree_core.dart +++ b/packages/two_dimensional_scrollables/lib/src/tree_view/tree_core.dart @@ -21,7 +21,7 @@ import 'tree.dart'; /// /// * [TreeViewNode.toggleNode], for controlling node expansion /// programmatically. -typedef TreeViewNodeCallback = void Function(TreeViewNode node); +typedef TreeViewNodeCallback = void Function(TreeViewNode node); /// A mixin for classes implementing a tree structure as expected by a /// [TreeViewController]. diff --git a/packages/two_dimensional_scrollables/lib/src/tree_view/tree_delegate.dart b/packages/two_dimensional_scrollables/lib/src/tree_view/tree_delegate.dart index 3cac931ed4c..c96bc789713 100644 --- a/packages/two_dimensional_scrollables/lib/src/tree_view/tree_delegate.dart +++ b/packages/two_dimensional_scrollables/lib/src/tree_view/tree_delegate.dart @@ -12,16 +12,16 @@ import 'tree_span.dart'; /// /// Used by the [TreeViewDelegateMixin.buildRow] to configure rows in the /// [TreeView]. -typedef TreeViewRowBuilder = TreeRow Function(TreeViewNode node); +typedef TreeViewRowBuilder = TreeRow Function(TreeViewNode node); /// Signature for a function that creates a [Widget] to represent the given /// [TreeViewNode] in the [TreeView]. /// /// Used by [TreeView.treeRowBuilder] to build rows on demand for the /// tree. -typedef TreeViewNodeBuilder = Widget Function( +typedef TreeViewNodeBuilder = Widget Function( BuildContext context, - TreeViewNode node, + TreeViewNode node, AnimationStyle toggleAnimationStyle, ); diff --git a/packages/two_dimensional_scrollables/pubspec.yaml b/packages/two_dimensional_scrollables/pubspec.yaml index 4c48c55b65b..45845c7afe0 100644 --- a/packages/two_dimensional_scrollables/pubspec.yaml +++ b/packages/two_dimensional_scrollables/pubspec.yaml @@ -1,6 +1,6 @@ name: two_dimensional_scrollables description: Widgets that scroll using the two dimensional scrolling foundation. -version: 0.3.0 +version: 0.3.1 repository: https://github.com/flutter/packages/tree/main/packages/two_dimensional_scrollables issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+two_dimensional_scrollables%22+ diff --git a/packages/two_dimensional_scrollables/test/tree_view/render_tree_test.dart b/packages/two_dimensional_scrollables/test/tree_view/render_tree_test.dart index 71d531e667c..3b239380d53 100644 --- a/packages/two_dimensional_scrollables/test/tree_view/render_tree_test.dart +++ b/packages/two_dimensional_scrollables/test/tree_view/render_tree_test.dart @@ -141,10 +141,10 @@ void main() { final List log = []; final TreeView treeView = TreeView( tree: treeNodes, - treeRowBuilder: (TreeViewNode node) { + treeRowBuilder: (TreeViewNode node) { if (node.depth! == 0) { return getTappableRow( - node as TreeViewNode, + node, () { log.add(node.content); tapCounter++; @@ -174,7 +174,7 @@ void main() { int exitCounter = 0; final TreeView treeView = TreeView( tree: treeNodes, - treeRowBuilder: (TreeViewNode node) { + treeRowBuilder: (TreeViewNode node) { if (node.depth! == 0) { return getMouseTrackingRow( onEnter: (_) => enterCounter++, @@ -397,7 +397,7 @@ void main() { treeView = TreeView( tree: treeNodes, - treeRowBuilder: (TreeViewNode node) { + treeRowBuilder: (TreeViewNode node) { if (node.depth! == 1) { // extent == 100 return row; @@ -766,7 +766,7 @@ void main() { controller: horizontalController, ), tree: treeNodes, - treeRowBuilder: (TreeViewNode node) { + treeRowBuilder: (TreeViewNode node) { return row.copyWith( backgroundDecoration: node.depth! == 0 ? rootBackgroundDecoration diff --git a/packages/two_dimensional_scrollables/test/tree_view/tree_test.dart b/packages/two_dimensional_scrollables/test/tree_view/tree_test.dart index bf8924a8ae8..a1790879fe9 100644 --- a/packages/two_dimensional_scrollables/test/tree_view/tree_test.dart +++ b/packages/two_dimensional_scrollables/test/tree_view/tree_test.dart @@ -130,7 +130,7 @@ void main() { controller: controller, treeNodeBuilder: ( BuildContext context, - TreeViewNode node, + TreeViewNode node, AnimationStyle toggleAnimationStyle, ) { returnedController ??= TreeViewController.of(context); @@ -153,7 +153,7 @@ void main() { tree: simpleNodeSet, treeNodeBuilder: ( BuildContext context, - TreeViewNode node, + TreeViewNode node, AnimationStyle toggleAnimationStyle, ) { returnedController ??= TreeViewController.maybeOf(context); @@ -454,9 +454,9 @@ void main() { home: TreeView( tree: simpleNodeSet, controller: controller, - onNodeToggle: (TreeViewNode node) { + onNodeToggle: (TreeViewNode node) { toggled = true; - toggledNode = node as TreeViewNode; + toggledNode = node; }, ), )); @@ -476,13 +476,13 @@ void main() { home: TreeView( tree: simpleNodeSet, controller: controller, - onNodeToggle: (TreeViewNode node) { + onNodeToggle: (TreeViewNode node) { toggled = true; - toggledNode = node as TreeViewNode; + toggledNode = node; }, treeNodeBuilder: ( BuildContext context, - TreeViewNode node, + TreeViewNode node, AnimationStyle toggleAnimationStyle, ) { final Duration animationDuration = toggleAnimationStyle.duration ?? @@ -510,7 +510,7 @@ void main() { // Spacer const SizedBox(width: 8.0), // Content - Text(node.content.toString()), + Text(node.content), ]), ), ); @@ -535,11 +535,11 @@ void main() { tree: simpleNodeSet, treeNodeBuilder: ( BuildContext context, - TreeViewNode node, + TreeViewNode node, AnimationStyle toggleAnimationStyle, ) { style ??= toggleAnimationStyle; - return Text(node.content.toString()); + return Text(node.content); }, ), )); @@ -558,11 +558,11 @@ void main() { toggleAnimationStyle: AnimationStyle.noAnimation, treeNodeBuilder: ( BuildContext context, - TreeViewNode node, + TreeViewNode node, AnimationStyle toggleAnimationStyle, ) { style = toggleAnimationStyle; - return Text(node.content.toString()); + return Text(node.content); }, ), )); @@ -580,11 +580,11 @@ void main() { ), treeNodeBuilder: ( BuildContext context, - TreeViewNode node, + TreeViewNode node, AnimationStyle toggleAnimationStyle, ) { style ??= toggleAnimationStyle; - return Text(node.content.toString()); + return Text(node.content); }, ), )); @@ -693,6 +693,31 @@ void main() { expect(find.text('Child 2:1'), findsNothing); expect(find.text('Root 3'), findsOneWidget); }); + + test('should use the generic type for callbacks and builders', () { + final TreeView treeView = TreeView( + tree: simpleNodeSet, + treeNodeBuilder: ( + BuildContext context, + TreeViewNode node, + AnimationStyle animationStyle, + ) { + return TreeView.defaultTreeNodeBuilder( + context, + node, + animationStyle, + ); + }, + treeRowBuilder: (TreeViewNode node) { + return TreeView.defaultTreeRowBuilder(node); + }, + onNodeToggle: (TreeViewNode node) {}, + ); + + expect(treeView.onNodeToggle, isA>()); + expect(treeView.treeNodeBuilder, isA>()); + expect(treeView.treeRowBuilder, isA>()); + }); }); group('TreeViewport', () {