showWaveDialog<T> function

Future<T?> showWaveDialog<T>({
  1. required BuildContext context,
  2. required WidgetBuilder builder,
  3. bool barrierDismissible = true,
  4. bool useSafeArea = true,
  5. bool useRootNavigator = true,
  6. RouteSettings? routeSettings,
  7. Offset? anchorPoint,
})

Implementation

Future<T?> showWaveDialog<T>({
  required BuildContext context,
  required WidgetBuilder builder,
  bool barrierDismissible = true,
  bool useSafeArea = true,
  bool useRootNavigator = true,
  RouteSettings? routeSettings,
  Offset? anchorPoint,
}) {
  final CapturedThemes themes = InheritedTheme.capture(
    from: context,
    to: Navigator.of(context, rootNavigator: useRootNavigator).context,
  );
  final theme = Theme.of(context);

  return Navigator.of(context, rootNavigator: useRootNavigator).push<T>(
    PageRouteBuilder<T>(
      opaque: false,
      barrierDismissible: barrierDismissible,
      barrierColor: Colors.transparent,
      barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
      settings: routeSettings,
      pageBuilder:
          (context, animation, secondaryAnimation) => themes.wrap(
            Builder(
              builder:
                  (context) => Stack(
                    children: [
                      GestureDetector(
                        onTap: barrierDismissible ? () => Navigator.of(context).maybePop() : null,
                        // TODO: Fix background blur is not smooth
                        child: AnimatedBuilder(
                          animation: animation,
                          builder:
                              (context, child) => BackdropFilter(
                                filter: ImageFilter.blur(sigmaX: 3.0 * animation.value, sigmaY: 3.0 * animation.value),
                                child: Container(
                                  color: theme.colorScheme.scrim.withValues(alpha: 0.2 * animation.value),
                                ),
                              ),
                        ),
                      ),
                      Center(child: SafeArea(top: useSafeArea, bottom: useSafeArea, child: builder(context))),
                    ],
                  ),
            ),
          ),
      transitionsBuilder: (context, animation, secondaryAnimation, child) {
        final curvedAnimation = CurvedAnimation(parent: animation, curve: Curves.easeOut, reverseCurve: Curves.easeIn);
        return FadeTransition(opacity: curvedAnimation, child: child);
      },
    ),
  );
}