ancestorWidgetOfExactType method

  1. @override
Widget ancestorWidgetOfExactType (Type targetType)
override

Returns the nearest ancestor widget of the given type, which must be the type of a concrete Widget subclass.

In general, inheritFromWidgetOfExactType is more useful, since inherited widgets will trigger consumers to rebuild when they change. This method is appropriate when used in interaction event handlers (e.g. gesture callbacks) or for performing one-off tasks such as asserting that you have or don't have a widget of a specific type as an ancestor. The return value of a Widget's build method should not depend on the value returned by this method, because the build context will not rebuild if the return value of this method changes. This could lead to a situation where data used in the build method changes, but the widget is not rebuilt.

Calling this method is relatively expensive (O(N) in the depth of the tree). Only call this method if the distance from this widget to the desired ancestor is known to be small and bounded.

This method should not be called from State.deactivate or State.dispose because the widget tree is no longer stable at that time. To refer to an ancestor from one of those methods, save a reference to the ancestor by calling ancestorWidgetOfExactType in State.didChangeDependencies.

Implementation

@override
Widget ancestorWidgetOfExactType(Type targetType) {
  assert(_debugCheckStateIsActiveForAncestorLookup());
  Element ancestor = _parent;
  while (ancestor != null && ancestor.widget.runtimeType != targetType)
    ancestor = ancestor._parent;
  return ancestor?.widget;
}