flutter / flutter/devtools

Doubts about the implementation method of hitTest in widgetInspector

未关闭
#7,960 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
P2 screen: inspector
主要语言
Dart
星标
1.7k
派生
404
平均合并
6 天 17 小时
30 天内合并 PR
18

描述

why does the hitTest method overridden in widgetInspector need to be sorted? Logically speaking, what you get in hitTestHelper should be the traversal result of the entire renderObject tree. Because tree traversal is depth-first, the deepest hit node should be located first in the result array. But the result is not like this after removing sort in hitTest. What is the reason?

code:

```
List hitTest(Offset position, RenderObject root) {
final List regularHits = [];
final List edgeHits = [];

_hitTestHelper(regularHits, edgeHits, position, root, root.getTransformTo(null));
double area(RenderObject object) {
final Size size = object.semanticBounds.size;
return size.width * size.height;
}
regularHits.sort((RenderObject a, RenderObject b) => area(a).compareTo(area(b)));
final Set hits = {
...edgeHits,
...regularHits,
};
return hits.toList();
}

bool _hitTestHelper(
List hits,
List edgeHits,
Offset position,
RenderObject object,
Matrix4 transform,
) {
bool hit = false;
final Matrix4? inverse = Matrix4.tryInvert(transform);
if (inverse == null) {
return false;
}
final Offset localPosition = MatrixUtils.transformPoint(inverse, position);

final List children = object.debugDescribeChildren();
for (int i = children.length - 1; i >= 0; i -= 1) {
final DiagnosticsNode diagnostics = children[i];
if (diagnostics.style == DiagnosticsTreeStyle.offstage ||
diagnostics.value is! RenderObject) {
continue;
}
final RenderObject child = diagnostics.value! as RenderObject;
final Rect? paintClip = object.describeApproximatePaintClip(child);
if (paintClip != null && !paintClip.contains(localPosition)) {
continue;
}

final Matrix4 childTransform = transform.clone();
object.applyPaintTransform(child, childTransform);
if (_hitTestHelper(hits, edgeHits, position, child, childTransform)) {
hit = true;
}
}

final Rect bounds = object.semanticBounds;
if (bounds.contains(localPosition)) {
hit = true;
if (!bounds.deflate(_edgeHitMargin).contains(localPosition)) {
edgeHits.add(object);
}
}
if (hit) {
hits.add(object);
}
return hit;
}
```

贡献指南

打开贡献指南

调研方向

从 issue 中展示的 widgetInspector 的 hitTest 及其 _hitTestHelper 实现开始。跟踪子项遍历如何构建 regularHits 和 edgeHits,然后将该顺序与后续基于区域的排序进行比较;完成的标准是解释观察到的顺序,或确定实现中存在具体的不一致。

由索引模型根据 Issue 内容生成。

评估

技术栈
dart
领域
devtools
Issue 类型
缺陷
难度
3/5
预计耗时
1-2 天
活跃度
停滞
描述清晰度
需要澄清
新手友好度
30/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。