Files
PiliPlus/lib/common/widgets/draggable_sheet/dyn.dart
2026-04-21 14:17:36 +08:00

92 lines
2.4 KiB
Dart

part of 'package:PiliPlus/common/widgets/flutter/draggable_scrollable_sheet.dart';
class DynDraggableScrollableSheet extends DraggableScrollableSheet {
const DynDraggableScrollableSheet({
super.key,
super.initialChildSize,
super.minChildSize,
super.maxChildSize,
super.expand,
super.snap,
super.snapSizes,
super.snapAnimationDuration,
super.controller,
super.shouldCloseOnMinExtent,
required super.builder,
});
@override
State<DraggableScrollableSheet> createState() =>
_DynDraggableScrollableSheetState();
}
class _DynDraggableScrollableSheetState extends _DraggableScrollableSheetState {
@override
void initState() {
super.initState();
_extent = _DraggableSheetExtent(
minSize: widget.minChildSize,
maxSize: widget.maxChildSize,
snap: widget.snap,
snapSizes: _impliedSnapSizes(),
snapAnimationDuration: widget.snapAnimationDuration,
initialSize: widget.initialChildSize,
shouldCloseOnMinExtent: widget.shouldCloseOnMinExtent,
);
_scrollController = _DynDraggableScrollableSheetScrollController(
extent: _extent,
);
widget.controller?._attach(_scrollController);
}
}
class _DynDraggableScrollableSheetScrollController
extends _DraggableScrollableSheetScrollController {
_DynDraggableScrollableSheetScrollController({
required super.extent,
});
@override
_DraggableScrollableSheetScrollPosition createScrollPosition(
ScrollPhysics physics,
ScrollContext context,
ScrollPosition? oldPosition,
) {
return _DynDraggableScrollableSheetScrollPosition(
physics: physics.applyTo(const AlwaysScrollableScrollPhysics()),
context: context,
oldPosition: oldPosition,
getExtent: () => extent,
);
}
}
class _DynDraggableScrollableSheetScrollPosition
extends _DraggableScrollableSheetScrollPosition {
_DynDraggableScrollableSheetScrollPosition({
required super.physics,
required super.context,
super.oldPosition,
required super.getExtent,
});
bool _isAtTop = true;
@override
bool get listShouldScroll => !_isAtTop || super.listShouldScroll;
@override
void applyUserOffset(double delta) {
if (_isAtTop && pixels > 0) {
_isAtTop = false;
}
super.applyUserOffset(delta);
}
@override
Drag drag(DragStartDetails details, VoidCallback dragCancelCallback) {
_isAtTop = pixels == 0;
return super.drag(details, dragCancelCallback);
}
}