showModal function
Implementation
void showModal(ModalEntry modalEntry) {
final context = modalEntry.context;
if (modalEntry.removeOnPop || modalEntry.removeOnPushNext) {
final widgetsApp = context.findAncestorWidgetOfExactType<WidgetsApp>();
if (widgetsApp == null) {
throw _routeObserverError;
}
final navigatorObservers = widgetsApp.navigatorObservers ?? [];
if (navigatorObservers.isEmpty) {
throw _routeObserverError;
}
_routeObserver = navigatorObservers.first as RouteObserver<ModalRoute>;
}
final overlayState = Overlay.of(context, rootOverlay: true);
final overlayEntry =
OverlayEntry(builder: (BuildContext context) => modalEntry);
WidgetsBinding.instance!.addPostFrameCallback((_) {
if (_modalsMap.containsKey(modalEntry.tag)) {
throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary(
'There are multiple modal entries that share the same tag'),
ErrorDescription(
'Each ModalEntry must have a unique non-null tag.\n'
'In this case, multiple modal entries had the following tag: ${modalEntry.tag}',
)
]);
}
final above = _modalsMap[modalEntry.aboveTag];
final below = _modalsMap[modalEntry.belowTag];
overlayState!.insert(overlayEntry, above: above, below: below);
_modalsMap.putIfAbsent(modalEntry.tag, () => overlayEntry);
});
}