首页 > 解决方案 > 在 performLayout 中构建和添加子项

问题描述

我正在制作一个技能树包,我希望有一个强大的 api 供用户改变节点之间边缘的外观。为此,我希望 edgeBuilder 的签名包含它连接的 from 和 to 节点的一些布局信息。例如,我可以将从一个节点到另一个节点的假想直线所形成的角度传递给构建器。然后可以使用这个角度来旋转我在边缘末端的小部件,以正确地看起来它们指向正确的东西(在下图中,我有一个总是指向下方的三角形剪裁器)。

在此处输入图像描述

我有这个结构用于在我的多子自定义 RenderObject 中布置子(边和节点)。

@override
void performLayout() {
  // ...
  final skillNodeLayout = delegate.layoutNodes(
    loosenedConstraints,
    graph,
    nodeChildren,
  );

  size = skillNodeLayout.size;

  // ...

  delegate.layoutEdges(
    loosenedConstraints,
    skillNodeLayout,
    graph,
    edgeChildren,
    nodeChildren,
  );
}

但现在我很想知道 Flutter 是否建议不要在布局阶段构建和添加小部件。我正在混入特别具有添加到子列表的ContainerRenderObjectMixin方法,例如adoptChild(child)addAll

我是否可以避免将边缘子代传递给 RenderObject 构造函数,而是将它们作为我在节点布局之后调用然后添加到 RenderObject 的构建器函数的普通列表传递?大致是这样的:

@override
void performLayout() {
  // ...
  final skillNodeLayout = delegate.layoutNodes(
    loosenedConstraints,
    graph,
    nodeChildren,
  );

  size = skillNodeLayout.size;

  final edgeChildren = edgeChildrenBuilders.map((builder) {
    return builder(skillNodeLayout);
  }).toList();

  // Found in the `ContainerRenderObjectMixin`
  addAll(edgeChildren);

  delegate.layoutEdges(
    loosenedConstraints,
    skillNodeLayout,
    graph,
    edgeChildren,
    nodeChildren,
  );
}

我担心的是,每次请求 performLayout 时,它都会不断向 RenderObject 添加子级,或者这从来都不是使用 renderObjects 的预期方式。

标签: flutterflutter-layout

解决方案


推荐阅读