flutter - 在 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 的预期方式。
解决方案
推荐阅读
- angular - 使用 TypeScript 在 Angular 中迭代对象的正确方法是什么?
- c - 请解释为什么这个 C 代码给我一个分段错误?
- android - Android - MaterialDatePicker 布局问题
- libreoffice - 有没有办法关闭 LIbreOffice Calc 上视图的自动/粘性定位?
- node.js - 尝试在 Mac 上安装 Vue CLI 时终端挂起
- python - 以 json 格式发送字符串列表
- algorithm - 什么是 exp(O(n)),它与 O(exp(n)) 有何不同?
- javascript - 如何将类应用于在 p5.js 中创建的 P 标签?
- javascript - 如何在 Nuxt-js 方法中路由空白页面?
- list - 替换方案列表中的值