showDialog method

Future showDialog(
  1. UIRoute<DialogType> dialog, {
  2. bool? forceGlobal,
  3. bool? dismissable,
  4. bool? uniqueInStack,
  5. Object? id,
  6. NavigationRouteBuilder? customRouteBuilder,
})

Implementation

Future<dynamic> showDialog(
  UIRoute<DialogType> dialog, {
  bool? forceGlobal,
  bool? dismissable,
  bool? uniqueInStack,
  Object? id,
  NavigationRouteBuilder? customRouteBuilder,
}) async {
  final bool global = _checkGlobalNavigatorNeeded(
    forceGlobal ?? dialog.defaultSettings.global,
  );

  final dialogSettings = UIRouteSettings(
    global: global,
    uniqueInStack: uniqueInStack ?? dialog.defaultSettings.uniqueInStack,
    dismissable: dismissable ?? dialog.defaultSettings.dismissable,
    id: id ?? dialog.defaultSettings.id,
    name: dialog.name.toString(),
    customRouteBuilder:
        customRouteBuilder ?? dialog.defaultSettings.customRouteBuilder,
  );

  if (dialogSettings.uniqueInStack &&
      !navigationStack.checkUnique(
        routeName: dialog,
        tab: currentTab,
        global: true,
      )) {
    return;
  }

  final dialogName = dialog.name;

  final navigator =
      global ? bottomSheetDialogNavigatorKey : currentTabKeys[currentTab]!;

  navigationStack.addRoute(
    routeName: dialogName,
    tab: currentTab,
    settings: dialogSettings,
  );

  final dialogToOpen = dialog.child;

  unawaited(onDialogOpened(dialogToOpen, dialogSettings));

  final routeBuilder =
      dialogSettings.customRouteBuilder ?? settings.routeBuilder;

  // coverage:ignore-start
  final stackLength = global
      ? navigationStack.globalNavigationStack.stack.length
      : navigationStack.tabNavigationStack.stack[currentTab]!.length;
  // coverage:ignore-end

  final route = routeBuilder.buildDialogRoute(
    navigator: navigator,
    dismissable: dialogSettings.dismissable,
    child: dialogToOpen,
    // coverage:ignore-start
    onPop: () {
      final currentStackLength = global
          ? navigationStack.globalNavigationStack.stack.length
          : navigationStack.tabNavigationStack.stack[currentTab]!.length;

      if (currentStackLength == stackLength) {
        pop(onlyInternalStack: true);
      }
    },
    // coverage:ignore-end
  );

  final result = await navigator.currentState?.push(route);

  return result;
}