我今天一直在解决一个问题,需要检测widget tree中特定的小部件,所以我一直在尝试使用context.visitChildElements
和element.visitChildren
。我可以看到树中所有的小部件,但是数量太多了。
我查看了flutter小部件检查器的工作方式,他们有一些内部期望,在其他用户代码库中可能不存在。例如,我有一个页面,包含一个Center小部件和一个Material button小部件。将上下文传递给我的函数会打印出大约200多个小部件,并散布着这三个小部件。我希望只打印出这三个小部件,或者至少消除Flutter自动创建的小部件,而不是由用户提供的代码创建的。
List<WidgetInfo> getElements(BuildContext context) {
var widgetsOfInterest = <WidgetInfo>[];
widgetsOfInterest.clear();
int indentation = 0;
void visitor(Element element) {
indentation++;
Key? key = element.widget.key;
String className = element.widget.runtimeType.toString();
while (element.findRenderObject() is! RenderBox) {}
RenderBox box = element.findRenderObject() as RenderBox;
var offset = box.getTransformTo(null).getTranslation();
final indent = ' ' * indentation;
// Here I want to check if this is a widget we created and print its name and offset
if (debugIsLocalCreationLocation(element)) print('$className $offset');
if ((MaterialButton).toString() == className) {
widgetsOfInterest.add(WidgetInfo(
indentation: indentation,
size: box.size,
paintBounds: box.paintBounds.shift(
Offset(offset.x, offset.y),
),
key: key,
className: className,
));
}
element.visitChildren(visitor);
}
context.visitChildElements(visitor);
return widgetsOfInterest;
}
如果有任何了解Flutter组件树并能指引我方向的经验与见解,我将不胜感激。