Flutter Animated Tree View:SliverTreeView加载后如何折叠所有节点?
解决SliverTreeView默认展开所有节点且onTreeReady折叠无效的问题
可能的原因
onTreeReady的触发时机可能早于树的实际渲染完成,直接调用collapseNode无法生效;或者未指定递归折叠子节点,导致根节点折叠后子节点仍处于展开状态。
解决方案
方案1:延迟执行折叠操作
利用Future.delayed(Duration.zero)将折叠操作放到微任务队列,确保树完成渲染后再执行,同时加上recursive: true递归折叠所有子节点:
SliverTreeView.simple( tree: simpleTree, expansionBehavior: ExpansionBehavior.collapseOthers, showRootNode: false, key: _simpleTreeKey, onTreeReady: (controller) { Future.delayed(Duration.zero, () { // 递归折叠根节点及所有子节点 controller.collapseNode(simpleTree, recursive: true); }); }, scrollController: scrollController, builder: (context, node) => Card( child: node.isRoot ? buildRootItem(node) : buildListItem(node)), ),
方案2:初始化时设置所有节点为折叠状态
在构建simpleTree时,直接给每个节点设置expanded: false,从根源避免默认展开:
// 示例构建折叠状态的树结构 final simpleTree = TreeNode.root( children: [ TreeNode( data: "父节点1", expanded: false, children: [ TreeNode(data: "子节点1-1", expanded: false), TreeNode(data: "子节点1-2", expanded: false), ], ), TreeNode( data: "父节点2", expanded: false, children: [ TreeNode(data: "子节点2-1", expanded: false), ], ), ], );
方案3:提前初始化TreeController并配置默认折叠
提前创建TreeController并设置allNodesExpanded: false,将其传入SliverTreeView,无需依赖onTreeReady:
late final TreeController _treeController; @override void initState() { super.initState(); // 初始化控制器时指定所有节点默认折叠 _treeController = TreeController(allNodesExpanded: false); } // 在SliverTreeView中使用该控制器 SliverTreeView.simple( tree: simpleTree, controller: _treeController, // 传入自定义控制器 expansionBehavior: ExpansionBehavior.collapseOthers, showRootNode: false, key: _simpleTreeKey, scrollController: scrollController, builder: (context, node) => Card( child: node.isRoot ? buildRootItem(node) : buildListItem(node)), ),
内容的提问来源于stack exchange,提问作者Dev Conductor
相关产品推荐
相关产品推荐

