persistent static method

Widget persistent({
  1. Key? key,
  2. required Widget child,
  3. double initialChildSize = 0.5,
  4. double minChildSize = 0.25,
  5. double maxChildSize = 1.0,
  6. bool snap = true,
  7. List<double>? snapSizes,
  8. bool showDragHandle = true,
  9. double? borderRadius,
  10. Color? backgroundColor,
  11. EdgeInsetsGeometry? padding,
  12. DraggableScrollableController? controller,
  13. bool visible = true,
  14. Duration enterDuration = const Duration(milliseconds: 300),
  15. ValueChanged<double>? onSizeChanged,
  16. double? hideHandleThreshold,
  17. double? dismissThreshold,
  18. VoidCallback? onDismissed,
})

创建一个【常驻、非模态】底部面板(高德地图首页那种效果)

show 的区别:

  • show 是模态弹窗,有遮罩,会拦截背景交互,关闭即消失
  • persistent 返回一个 Widget,需自己放进页面的 Stack 里, 面板浮在内容之上,面板以外区域【背景始终可交互】,面板不会消失(只收起到最小档位)

用法:放进 Stack,底层是你的地图/内容

Stack(
  children: [
    YourMapOrContent(),           // 底层内容,可交互
    VBottomSheet.persistent(      // 常驻吸附面板
      snap: true,
      snapSizes: [0.4],
      minChildSize: 0.12,
      maxChildSize: 0.92,
      initialChildSize: 0.4,
      child: YourPanelContent(),
    ),
  ],
)

controller 可选,传入后可用代码控制面板展开/收起(如 controller.animateTo) visible 控制显隐(带从下往上滑入/滑出动画)。请求数据期间设 false, 数据回来 setState 改 true,面板即滑入——可同时满足"进场动画"和"数据到了才弹" enterDuration 进场/退场滑动动画时长,默认 300ms onSizeChanged 拖拽高度变化回调,参数为当前高度占屏比 0,1,可据此联动顶部栏 hideHandleThreshold 高度占比超过此值时自动隐藏拖拽手柄(如 0.85,面板接近全屏时隐藏) dismissThreshold 下拖到此高度占比以下时关闭面板(带滑出动画)。默认 null = 不可关闭(常驻)。 注意:需让 minChildSize ≤ dismissThreshold,面板才能拖到阈值下方触发关闭 onDismissed 面板被下拖关闭后的回调(配合 dismissThreshold 使用)

Implementation

static Widget persistent({
  Key? key,
  required Widget child,
  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),
  ValueChanged<double>? onSizeChanged,
  double? hideHandleThreshold,
  double? dismissThreshold,
  VoidCallback? onDismissed,
}) {
  return _VPersistentSheet(
    key: key,
    initialChildSize: initialChildSize,
    minChildSize: minChildSize,
    maxChildSize: maxChildSize,
    snap: snap,
    snapSizes: snapSizes,
    showDragHandle: showDragHandle,
    borderRadius: borderRadius,
    backgroundColor: backgroundColor,
    padding: padding,
    controller: controller,
    visible: visible,
    enterDuration: enterDuration,
    onSizeChanged: onSizeChanged,
    hideHandleThreshold: hideHandleThreshold,
    dismissThreshold: dismissThreshold,
    onDismissed: onDismissed,
    child: child,
  );
}