show<T> static method
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,
以模态框形式显示抽屉的静态方法
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,
);
},
);
}