1分钟
03 RendererBinding.hitTest
在 RendererBinding.hitTest
中会执行 renderView.hitTest(result, position: position);
,如下代码所示,renderView.hitTest
方法内会执行 child.hitTest
,它将尝试将符合条件的 child 控件添加到 HitTestResult
里,最后把自己添加进去。
///RendererBinding
bool hitTest(HitTestResult result, { Offset position }) {
if (child != null)
child.hitTest(result, position: position);
result.add(HitTestEntry(this));
return true;
}
而查看 child.hitTest
方法源码,如下所示,RenderObjcet
中的hitTest
,会通过 _size.contains
判断自己是否属于响应区域,确认响应后执行 hitTestChildren
和 hitTestSelf
,尝试添加下级的 child 和自己添加进去,这样的递归就让我们自下而上的得到了一个 HitTestResult
的相应控件列表了,最底下的 Child 在最上面。
///RenderObjcet
bool hitTest(HitTestResult result, { @required Offset position }) {
if (_size.contains(position)) {
if (hitTestChildren(result, position: position) || hitTestSelf(position)) {
result.add(BoxHitTestEntry(this, position));
return true;
}
}
return false;
}
学员评价