showModal function

void showModal(
  1. ModalEntry modalEntry
)

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);
  });
}