- override
Obtains the nearest widget of the given type, which must be the type of a
concrete InheritedWidget
subclass, and registers this build context with
that widget such that when that widget changes (or a new widget of that
type is introduced, or the widget goes away), this build context is
rebuilt so that it can obtain new values from that widget.
This is typically called implicitly from of()
static methods, e.g.
Theme.of
.
This should not be called from widget constructors or from
State.initState
methods, because those methods would not get called
again if the inherited value were to change. To ensure that the widget
correctly updates itself when the inherited value changes, only call this
(directly or indirectly) from build methods, layout and paint callbacks, or
from State.dependenciesChanged
.
It is also possible to call this from interaction event handlers (e.g. gesture callbacks) or timers, to obtain a value once, if that value is not going to be cached and reused later.
Calling this method is O(1) with a small constant factor, but will lead to the widget being rebuilt more often.
Once a widget registers a dependency on a particular type by calling this
method, it will be rebuilt, and State.dependenciesChanged
will be
called, whenever changes occur relating to that widget until the next time
the widget or one of its ancestors is moved (for example, because an
ancestor is added or removed).
Source
@override InheritedWidget inheritFromWidgetOfExactType(Type targetType) { InheritedElement ancestor = _inheritedWidgets == null ? null : _inheritedWidgets[targetType]; if (ancestor != null) { assert(ancestor is InheritedElement); _dependencies ??= new HashSet<InheritedElement>(); _dependencies.add(ancestor); ancestor._dependents.add(this); return ancestor.widget; } _hadUnsatisfiedDependencies = true; return null; }