Flutter中如何实现GraphView或TreeView视图的居中显示?
问题根因
你设置了InteractiveViewer的constrained: false属性,此时子组件不受InteractiveViewer的尺寸约束,外层包裹的Center、Container对齐配置都不会生效,GraphView默认从左上角开始绘制内容。
解决方案
方案1(最简实现)
直接给InteractiveViewer添加alignment: Alignment.center属性即可,该属性专门用于控制子组件在可视区域的初始对齐方式,即使constrained: false也会生效。
修改后的完整代码如下:
InteractiveViewer( constrained: false, boundaryMargin: const EdgeInsets.all(20), // 新增此行居中配置 alignment: Alignment.center, child: GraphView( graph: graph, algorithm: BuchheimWalkerAlgorithm(builder, TreeEdgeRenderer(builder)), paint: Paint() ..color = Colors.black ..strokeWidth = 1.5 ..style = PaintingStyle.stroke, builder: (Node node) { var a = node.key?.value as int; var nodeValue = _nodeData.firstWhere((element) => element.id == a); var _eid = (nodeValue.id).toString(); var _id = (nodeValue.uid).toString(); var _name = (nodeValue.name).toString(); return rectangleWidget(_id, _name, _eid); }, ), )
方案2(自定义偏移,适用动态节点场景)
如果方案1不满足需求(比如需要自定义偏移量),可以通过LayoutBuilder获取父容器尺寸,提前计算树形图总尺寸后手动设置偏移:
LayoutBuilder( builder: (context, constraints) { // 替换为你实际的节点宽高 const double nodeWidth = 120; const double nodeHeight = 60; algorithm.setDimensions(nodeWidth, nodeHeight); Size totalGraphSize = algorithm.getSize(graph); return InteractiveViewer( constrained: false, boundaryMargin: const EdgeInsets.all(20), child: Transform.translate( // 计算居中偏移 offset: Offset( (constraints.maxWidth - totalGraphSize.width) / 2, (constraints.maxHeight - totalGraphSize.height) / 2, ), child: GraphView( graph: graph, algorithm: BuchheimWalkerAlgorithm(builder, TreeEdgeRenderer(builder)), paint: Paint() ..color = Colors.black ..strokeWidth = 1.5 ..style = PaintingStyle.stroke, builder: (Node node) { var a = node.key?.value as int; var nodeValue = _nodeData.firstWhere((element) => element.id == a); var _eid = (nodeValue.id).toString(); var _id = (nodeValue.uid).toString(); var _name = (nodeValue.name).toString(); return rectangleWidget(_id, _name, _eid); }, ), ), ); } )
注意事项
- 方案2中设置的
nodeWidth和nodeHeight必须和你自定义的rectangleWidget实际尺寸一致,否则会出现居中偏差 - 若树形图节点动态更新,每次节点变更后需要重新计算总尺寸更新偏移量
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

