Skip to content

Commit e20f2e0

Browse files
committed
feat: add useTreeSliverController
1 parent d5f024b commit e20f2e0

File tree

3 files changed

+100
-2
lines changed

3 files changed

+100
-2
lines changed

packages/flutter_hooks/lib/src/hooks.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:flutter/material.dart'
99
WidgetStatesController,
1010
SearchController,
1111
TabController,
12+
TreeSliverController,
1213
WidgetState;
1314
import 'package:flutter/scheduler.dart';
1415
import 'package:flutter/widgets.dart';
@@ -17,6 +18,7 @@ import 'framework.dart';
1718

1819
part 'animation.dart';
1920
part 'async.dart';
21+
part 'debounced.dart';
2022
part 'draggable_scrollable_controller.dart';
2123
part 'expansion_tile_controller.dart';
2224
part 'fixed_extent_scroll_controller.dart';
@@ -34,6 +36,6 @@ part 'search_controller.dart';
3436
part 'tab_controller.dart';
3537
part 'text_controller.dart';
3638
part 'transformation_controller.dart';
37-
part 'widgets_binding_observer.dart';
39+
part 'tree_sliver_controller.dart';
3840
part 'widget_states_controller.dart';
39-
part 'debounced.dart';
41+
part 'widgets_binding_observer.dart';
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
part of 'hooks.dart';
2+
3+
/// Creates a [TreeSliverController] that will be disposed automatically.
4+
///
5+
/// See also:
6+
/// - [TreeSliverController]
7+
TreeSliverController useTreeSliverController() {
8+
return use(const _TreeSliverControllerHook());
9+
}
10+
11+
class _TreeSliverControllerHook extends Hook<TreeSliverController> {
12+
const _TreeSliverControllerHook();
13+
14+
@override
15+
HookState<TreeSliverController, Hook<TreeSliverController>> createState() =>
16+
_TreeSliverControllerHookState();
17+
}
18+
19+
class _TreeSliverControllerHookState
20+
extends HookState<TreeSliverController, _TreeSliverControllerHook> {
21+
final controller = TreeSliverController();
22+
23+
@override
24+
String get debugLabel => 'useTreeSliverController';
25+
26+
@override
27+
TreeSliverController build(BuildContext context) => controller;
28+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import 'package:flutter/foundation.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_hooks/src/framework.dart';
4+
import 'package:flutter_hooks/src/hooks.dart';
5+
6+
import 'mock.dart';
7+
8+
void main() {
9+
testWidgets('debugFillProperties', (tester) async {
10+
await tester.pumpWidget(
11+
HookBuilder(builder: (context) {
12+
useTreeSliverController();
13+
return const SizedBox();
14+
}),
15+
);
16+
17+
await tester.pump();
18+
19+
final element = tester.element(find.byType(HookBuilder));
20+
21+
expect(
22+
element
23+
.toDiagnosticsNode(style: DiagnosticsTreeStyle.offstage)
24+
.toStringDeep(),
25+
equalsIgnoringHashCodes(
26+
'HookBuilder\n'
27+
" │ useTreeSliverController: Instance of 'TreeSliverController'\n"
28+
' └SizedBox(renderObject: RenderConstrainedBox#00000)\n',
29+
),
30+
);
31+
});
32+
33+
group('useTreeSliverController', () {
34+
testWidgets('check expansion/collapse of node', (tester) async {
35+
late TreeSliverController controller;
36+
final tree = <TreeSliverNode<int>>[
37+
TreeSliverNode(0, children: [TreeSliverNode(1), TreeSliverNode(2)]),
38+
TreeSliverNode(
39+
expanded: true, 3, children: [TreeSliverNode(4), TreeSliverNode(5)])
40+
];
41+
await tester.pumpWidget(MaterialApp(
42+
home: Scaffold(
43+
body: HookBuilder(builder: (context) {
44+
controller = useTreeSliverController();
45+
return CustomScrollView(slivers: [
46+
TreeSliver(
47+
controller: controller,
48+
tree: tree,
49+
),
50+
]);
51+
}),
52+
),
53+
));
54+
55+
expect(controller.isExpanded(tree[0]), false);
56+
controller.expandNode(tree[0]);
57+
expect(controller.isExpanded(tree[0]), true);
58+
controller.collapseNode(tree[0]);
59+
expect(controller.isExpanded(tree[0]), false);
60+
61+
expect(controller.isExpanded(tree[1]), true);
62+
controller.collapseNode(tree[1]);
63+
expect(controller.isExpanded(tree[1]), false);
64+
controller.expandNode(tree[1]);
65+
expect(controller.isExpanded(tree[1]), true);
66+
});
67+
});
68+
}

0 commit comments

Comments
 (0)