showSlideInOverlay<T> static method

Future<T?> showSlideInOverlay<T>({
  1. required BuildContext context,
  2. required Widget child,
  3. double widthRatio = 0.8,
  4. String barrierLabel = '关闭遮罩层',
  5. double backdropOpacity = 0.5,
  6. Duration animationDuration = const Duration(milliseconds: 300),
  7. bool barrierDismissible = true,
  8. BorderRadius? borderRadius,
  9. VoidCallback? onClose,
})

显示从右侧滑入的遮罩层

context 用于显示遮罩层的上下文 child 要显示在遮罩层中的内容 widthRatio 遮罩层宽度比例(相对于屏幕宽度),默认 0.8 barrierLabel 无障碍标签,默认 "关闭遮罩层" backdropOpacity 背景遮罩透明度,默认 0.5 animationDuration 动画持续时间,默认 300 毫秒 barrierDismissible 是否允许点击背景关闭,默认 true borderRadius 遮罩层圆角,默认只有左上和左下圆角 onClose 遮罩层关闭时的回调

Implementation

static Future<T?> showSlideInOverlay<T>({
  required BuildContext context,
  required Widget child,
  double widthRatio = 0.8,
  String barrierLabel = '关闭遮罩层',
  double backdropOpacity = 0.5,
  Duration animationDuration = const Duration(milliseconds: 300),
  bool barrierDismissible = true,
  BorderRadius? borderRadius,
  VoidCallback? onClose,
}) {
  if (kDebugMode) {
    debugPrint('OverlayService: showSlideInOverlay - 显示遮罩层');
  }

  return showGeneralDialog<T>(
    context: context,
    barrierColor: Colors.transparent,
    barrierDismissible: false,
    // 禁用默认的 barrier 点击关闭,我们自己处理
    barrierLabel: barrierLabel,
    pageBuilder: (context, animation, secondaryAnimation) {
      if (kDebugMode) {
        debugPrint('OverlayService: pageBuilder - 创建遮罩层页面');
      }
      return _SlideInOverlay(
        widthRatio: widthRatio,
        backdropOpacity: backdropOpacity,
        animationDuration: animationDuration,
        borderRadius: borderRadius,
        onClose: onClose ?? () {},
        child: child,
        closeCallback: () {
          if (kDebugMode) {
            debugPrint('OverlayService: closeCallback - 触发关闭遮罩层');
          }
          _closeCurrentOverlay?.call();
        },
      );
    },
    transitionBuilder: (context, animation, secondaryAnimation, child) {
      return child;
    },
    transitionDuration: Duration.zero,
  ).then((_) {
    // 对话框关闭后,清除回调引用
    _closeCurrentOverlay = null;
    return null;
  });
}