of static method
- BuildContext context, {
- bool rootOverlay = false,
- Widget? debugRequiredFor,
The OverlayState from the closest instance of Overlay that encloses the given context within the closest LookupBoundary, and, in debug mode, will throw if one is not found.
In debug mode, if the debugRequiredFor
argument is provided and an
overlay isn't found, then this function will throw an exception containing
the runtime type of the given widget in the error message. The exception
attempts to explain that the calling Widget (the one given by the
debugRequiredFor
argument) needs an Overlay to be present to function.
If debugRequiredFor
is not supplied, then the error message is more
generic.
Typical usage is as follows:
OverlayState overlay = Overlay.of(context);
If rootOverlay
is set to true, the state from the furthest instance of
this class is given instead. Useful for installing overlay entries above
all subsequent instances of Overlay.
This method can be expensive (it walks the element tree).
See also:
- Overlay.maybeOf for a similar function that returns null if an Overlay is not found.
Implementation
static OverlayState of(
BuildContext context, {
bool rootOverlay = false,
Widget? debugRequiredFor,
}) {
final OverlayState? result = maybeOf(context, rootOverlay: rootOverlay);
assert(() {
if (result == null) {
final bool hiddenByBoundary = LookupBoundary.debugIsHidingAncestorStateOfType<OverlayState>(context);
final List<DiagnosticsNode> information = <DiagnosticsNode>[
ErrorSummary('No Overlay widget found${hiddenByBoundary ? ' within the closest LookupBoundary' : ''}.'),
if (hiddenByBoundary)
ErrorDescription(
'There is an ancestor Overlay widget, but it is hidden by a LookupBoundary.'
),
ErrorDescription('${debugRequiredFor?.runtimeType ?? 'Some'} widgets require an Overlay widget ancestor for correct operation.'),
ErrorHint('The most common way to add an Overlay to an application is to include a MaterialApp, CupertinoApp or Navigator widget in the runApp() call.'),
if (debugRequiredFor != null) DiagnosticsProperty<Widget>('The specific widget that failed to find an overlay was', debugRequiredFor, style: DiagnosticsTreeStyle.errorProperty),
if (context.widget != debugRequiredFor)
context.describeElement('The context from which that widget was searching for an overlay was'),
];
throw FlutterError.fromParts(information);
}
return true;
}());
return result!;
}