在 Navigator 的源码体系里,有两个关键对象对外提供了全局引用的能力,分别是:Navigator 和 Overlay,借助的均是 BuildContext的 ancestor*方法向上查找。 BuildContext 是 Element 的抽象类,所以BuildContext的查找也就是在 Element 树中遍历查找需要的元素。 我们看看BuildContext都提供了哪些方法
ancestorInheritedElementForWidgetOfExactType --- 向上查找最近的InheritedWidget的 InheritedElement inheritFromWidgetOfExactType --- 向上查找最近的InheritedWidget ancestorRenderObjectOfType --- 向上查找最近的给定类型的RenderObject ancestorStateOfType --- 向上查找最近的给定类型的StatefulWidget的State对象 ancestorWidgetOfExactType --- 向上查找最近的给定类型的Widget findRenderObject --- 向下查找当前的RenderObject rootAncestorStateOfType --- 向上查找最顶层的给定类型的 State
visitAncestorElements(bool visitor(Element element)) --- 向上遍历 Ancestor
向上查找较为简单,传入对应类型即可,向下BuildContext也提供了遍历 child的方法: visitChildElements(ElementVisitor visitor) --- 向下遍历 child
以Overlay的静态方法of方法为例(Navigator也有类似的of方法),传入需要查找的类型对象TypeMatcher,向上查找到最近的OverlayState,使得Overlay无需层层向下传递自己的引用,底层 Widget 遍可以在任何地方拿到Overlay引用,并调用它的方法或属性,
引用链接: juejin.cn/post/684490…