scaffold static method

Widget scaffold({
  1. Key? key,
  2. required Widget background,
  3. required Widget sheetChild,
  4. Widget overlayBuilder(
    1. BuildContext context,
    2. double extent
    )?,
  5. double initialChildSize = 0.5,
  6. double minChildSize = 0.25,
  7. double maxChildSize = 1.0,
  8. bool snap = true,
  9. List<double>? snapSizes,
  10. bool showDragHandle = true,
  11. double? borderRadius,
  12. Color? backgroundColor,
  13. EdgeInsetsGeometry? padding,
  14. DraggableScrollableController? controller,
  15. bool visible = true,
  16. Duration enterDuration = const Duration(milliseconds: 300),
  17. double? hideHandleThreshold,
  18. double? dismissThreshold,
  19. 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,
  );
}