show<T> static method

Future<T?> show<T>({
  1. required BuildContext context,
  2. required Widget child,
  3. NZDrawerPosition position = NZDrawerPosition.left,
  4. double? size,
  5. Color? backgroundColor,
  6. double elevation = 16.0,
  7. bool showDragHandle = true,
  8. double borderRadius = 16.0,
})

以模态框形式显示抽屉的静态方法

Implementation

static Future<T?> show<T>({
  required BuildContext context,
  required Widget child,
  NZDrawerPosition position = NZDrawerPosition.left,
  double? size,
  Color? backgroundColor,
  double elevation = 16.0,
  bool showDragHandle = true,
  double borderRadius = 16.0,
}) {
  if (position == NZDrawerPosition.bottom) {
    return showModalBottomSheet<T>(
      context: context,
      backgroundColor: backgroundColor ?? Theme.of(context).canvasColor,
      elevation: elevation,
      isScrollControlled: true,
      showDragHandle: showDragHandle,
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.vertical(
          top: Radius.circular(borderRadius),
        ),
      ),
      builder: (context) => Container(
        height: size,
        constraints: BoxConstraints(
          maxHeight: MediaQuery.of(context).size.height * 0.9,
        ),
        child: child,
      ),
    );
  }

  // 对于顶部、左侧、右侧,我们使用自定义对话框或 Scaffold 集成的抽屉。
  // 为了简单起见,我们将顶部实现为底部菜单的变体,将左侧/右侧实现为标准抽屉。

  if (position == NZDrawerPosition.top) {
    return showGeneralDialog<T>(
      context: context,
      barrierDismissible: true,
      barrierLabel: '关闭',
      transitionDuration: const Duration(milliseconds: 300),
      pageBuilder: (context, anim1, anim2) {
        return Align(
          alignment: Alignment.topCenter,
          child: Material(
            color: backgroundColor ?? Theme.of(context).canvasColor,
            elevation: elevation,
            borderRadius: BorderRadius.vertical(
              bottom: Radius.circular(borderRadius),
            ),
            child: Container(
              width: double.infinity,
              height: size ?? 300,
              padding: EdgeInsets.only(
                top: MediaQuery.of(context).padding.top,
              ),
              child: child,
            ),
          ),
        );
      },
      transitionBuilder: (context, anim1, anim2, child) {
        return SlideTransition(
          position: Tween<Offset>(
            begin: const Offset(0, -1),
            end: Offset.zero,
          ).animate(anim1),
          child: child,
        );
      },
    );
  }

  // 对于左侧和右侧,通常与 Scaffold.drawer / Scaffold.endDrawer 一起使用
  // 但我们也可以将它们作为模态对话框显示。
  return showGeneralDialog<T>(
    context: context,
    barrierDismissible: true,
    barrierLabel: '关闭',
    transitionDuration: const Duration(milliseconds: 300),
    pageBuilder: (context, anim1, anim2) {
      return Align(
        alignment: position == NZDrawerPosition.left
            ? Alignment.centerLeft
            : Alignment.centerRight,
        child: Material(
          color: backgroundColor ?? Theme.of(context).canvasColor,
          elevation: elevation,
          borderRadius: BorderRadius.horizontal(
            left: position == NZDrawerPosition.right
                ? Radius.circular(borderRadius)
                : Radius.zero,
            right: position == NZDrawerPosition.left
                ? Radius.circular(borderRadius)
                : Radius.zero,
          ),
          child: SizedBox(
            width: size ?? 300,
            height: double.infinity,
            child: child,
          ),
        ),
      );
    },
    transitionBuilder: (context, anim1, anim2, child) {
      return SlideTransition(
        position: Tween<Offset>(
          begin: Offset(position == NZDrawerPosition.left ? -1 : 1, 0),
          end: Offset.zero,
        ).animate(anim1),
        child: child,
      );
    },
  );
}