show<T> static method

Future<T?> show<T>(
  1. BuildContext context, {
  2. required WidgetBuilder builder,
  3. UiControlledDrawerBuilder<T>? controlledBuilder,
  4. UiDrawerSide side = UiDrawerSide.start,
  5. UiDrawerVariant variant = UiDrawerVariant.standard,
  6. bool barrierDismissible = true,
  7. bool? blurBackdrop,
  8. Color? barrierColor,
})

Present a modal drawer from side. Returns the result passed to Navigator.maybePop.

Implementation

static Future<T?> show<T>(
  BuildContext context, {
  required WidgetBuilder builder,
  UiControlledDrawerBuilder<T>? controlledBuilder,
  UiDrawerSide side = UiDrawerSide.start,
  UiDrawerVariant variant = UiDrawerVariant.standard,
  bool barrierDismissible = true,
  bool? blurBackdrop,
  Color? barrierColor,
}) {
  final nested = UiDrawerNavigator.maybeOf(context);
  if (nested != null) {
    return nested.push<T>(
      builder: builder,
      controlledBuilder: controlledBuilder,
      side: side,
      variant: variant,
    );
  }

  final tokens = UiThemeTokens.of(context);
  final direction = Directionality.of(context);
  final effectiveBlurBackdrop =
      blurBackdrop ?? variant != UiDrawerVariant.standard;
  final navigator = Navigator.of(context, rootNavigator: true);
  final drawerTransitionDuration = UiStackedMotion.drawerDuration.resolve(
    context,
  );

  final capturedThemes = InheritedTheme.capture(
    from: context,
    to: navigator.context,
  );
  final route = navigator.push<T>(
    PageRouteBuilder<T>(
      opaque: false,
      barrierDismissible: false,
      barrierColor: const Color(0x00000000),
      transitionDuration: drawerTransitionDuration,
      reverseTransitionDuration: drawerTransitionDuration,
      pageBuilder: (ctx, animation, __) {
        return capturedThemes.wrap(
          UiScrollConfiguration(
            child: _DrawerRouteHost(
              animation: animation,
              side: side,
              variant: variant,
              direction: direction,
              builder: builder,
              controlledBuilder: _eraseControlledBuilder(controlledBuilder),
              blurBackdrop: effectiveBlurBackdrop,
              barrierColor: barrierColor ?? tokens.colors.overlay,
              barrierDismissible: barrierDismissible,
              transitionDuration: drawerTransitionDuration,
              onDismissRoute: ([result]) {
                Navigator.of(ctx).maybePop(result);
              },
            ),
          ),
        );
      },
      transitionsBuilder: (_, __, ___, child) => child,
    ),
  );
  return route;
}