flutter / flutter/devtools

Doubts about the implementation method of hitTest in widgetInspector

オープン
#7,960 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
P2 screen: inspector
主要言語
Dart
スター
1.7k
フォーク
404
平均マージ
6日 17時間
マージ済み PR(30日)
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 を短くまとめたダイジェスト。