persistent static method
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,
创建一个【常驻、非模态】底部面板(高德地图首页那种效果)
与 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,
);
}