scaffold static method
Widget
scaffold({
- Key? key,
- required Widget background,
- required Widget sheetChild,
- Widget overlayBuilder(
- BuildContext context,
- double extent
- double initialChildSize = 0.5,
- double minChildSize = 0.25,
- double maxChildSize = 1.0,
- bool snap = true,
- List<
double> ? snapSizes, - bool showDragHandle = true,
- double? borderRadius,
- Color? backgroundColor,
- EdgeInsetsGeometry? padding,
- DraggableScrollableController? controller,
- bool visible = true,
- Duration enterDuration = const Duration(milliseconds: 300),
- double? hideHandleThreshold,
- double? dismissThreshold,
- VoidCallback? onDismissed,
一站式【常驻面板布局壳】:背景 + 常驻面板 + 联动浮层,三层 Stack 自动摆好
相比 persistent 需要自己写 Stack、管层叠顺序、自己接 ValueNotifier 做联动, scaffold 把这些都封进组件:
- 自动保证层叠顺序:背景(底) → 面板(中) → 浮层(顶),浮层永远盖在面板之上
- 内部用 ValueNotifier 把面板实时高度占比喂给
overlayBuilder,联动不用自己搭 - 背景和浮层画什么完全由你定,组件不绑死业务内容
VBottomSheet.scaffold(
background: MyMap(), // 底层,可交互
sheetChild: MyList(), // 面板内容
snapSizes: [0.4], minChildSize: 0.12, maxChildSize: 0.92,
overlayBuilder: (context, extent) { // 浮层,extent 是当前高度占比
final p = ((extent - 0.6) / 0.3).clamp(0.0, 1.0);
return MyTopBar(progress: p);
},
)
background 底层内容(地图/播放页等),面板之外区域可正常交互
sheetChild 常驻面板的内容
overlayBuilder 浮层构建器,第二个参数为面板当前高度占比 0,1,可据此做渐变联动
其余参数同 persistent
Implementation
static Widget scaffold({
Key? key,
required Widget background,
required Widget sheetChild,
Widget Function(BuildContext context, double extent)? overlayBuilder,
double initialChildSize = 0.5,
double minChildSize = 0.25,
double maxChildSize = 1.0,
bool snap = true,
List<double>? snapSizes,
bool showDragHandle = true,
double? borderRadius,
Color? backgroundColor,
EdgeInsetsGeometry? padding,
DraggableScrollableController? controller,
bool visible = true,
Duration enterDuration = const Duration(milliseconds: 300),
double? hideHandleThreshold,
double? dismissThreshold,
VoidCallback? onDismissed,
}) {
return _VSheetScaffold(
key: key,
background: background,
sheetChild: sheetChild,
overlayBuilder: overlayBuilder,
initialChildSize: initialChildSize,
minChildSize: minChildSize,
maxChildSize: maxChildSize,
snap: snap,
snapSizes: snapSizes,
showDragHandle: showDragHandle,
borderRadius: borderRadius,
backgroundColor: backgroundColor,
padding: padding,
controller: controller,
visible: visible,
enterDuration: enterDuration,
hideHandleThreshold: hideHandleThreshold,
dismissThreshold: dismissThreshold,
onDismissed: onDismissed,
);
}