of<T> static method
Obtains the nearest Provider<T> up its widget tree and returns its value.
If listen
is true
, later value changes will trigger a new
State.build to widgets, and State.didChangeDependencies for
StatefulWidget.
listen: false
is necessary to be able to call Provider.of
inside
State.initState or the create
method of providers like so:
Provider(
create: (context) {
return Model(Provider.of<Something>(context, listen: false)),
},
)
Implementation
static T of<T>(BuildContext context, {bool listen = true}) {
assert(
context.owner!.debugBuilding ||
listen == false ||
debugIsInInheritedProviderUpdate,
'''
Tried to listen to a value exposed with provider, from outside of the widget tree.
This is likely caused by an event handler (like a button's onPressed) that called
Provider.of without passing `listen: false`.
To fix, write:
Provider.of<$T>(context, listen: false);
It is unsupported because may pointlessly rebuild the widget associated to the
event handler, when the widget tree doesn't care about the value.
The context used was: $context
''',
);
final inheritedElement = _inheritedElementOf<T>(context);
if (listen) {
context.dependOnInheritedElement(inheritedElement);
}
return inheritedElement.value;
}