Files
PiliPlus/lib/common/widgets/scroll_physics.dart
2026-02-09 09:55:01 +08:00

85 lines
2.4 KiB
Dart

import 'package:PiliPlus/common/widgets/flutter/page/tabs.dart';
import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:flutter/material.dart' hide TabBarView;
Widget videoTabBarView({
required List<Widget> children,
TabController? controller,
}) => TabBarView<CustomHorizontalDragGestureRecognizer>(
controller: controller,
physics: const CustomTabBarViewScrollPhysics(parent: ClampingScrollPhysics()),
horizontalDragGestureRecognizer: CustomHorizontalDragGestureRecognizer.new,
children: children,
);
Widget tabBarView({
required List<Widget> children,
TabController? controller,
}) => TabBarView<CustomHorizontalDragGestureRecognizer>(
physics: const CustomTabBarViewScrollPhysics(),
controller: controller,
horizontalDragGestureRecognizer: CustomHorizontalDragGestureRecognizer.new,
children: children,
);
SpringDescription _customSpringDescription() {
final List<double> springDescription = Pref.springDescription;
return SpringDescription(
mass: springDescription[0],
stiffness: springDescription[1],
damping: springDescription[2],
);
}
class CustomTabBarViewScrollPhysics extends ScrollPhysics {
const CustomTabBarViewScrollPhysics({super.parent});
@override
CustomTabBarViewScrollPhysics applyTo(ScrollPhysics? ancestor) {
return CustomTabBarViewScrollPhysics(parent: buildParent(ancestor));
}
static final _springDescription = _customSpringDescription();
@override
SpringDescription get spring => _springDescription;
}
mixin ReloadMixin {
late bool reload = false;
}
class ReloadScrollPhysics extends AlwaysScrollableScrollPhysics {
const ReloadScrollPhysics({super.parent, required this.controller});
final ReloadMixin controller;
@override
ReloadScrollPhysics applyTo(ScrollPhysics? ancestor) {
return ReloadScrollPhysics(
parent: buildParent(ancestor),
controller: controller,
);
}
@override
double adjustPositionForNewDimensions({
required ScrollMetrics oldPosition,
required ScrollMetrics newPosition,
required bool isScrolling,
required double velocity,
}) {
if (controller.reload) {
controller.reload = false;
return 0;
}
return super.adjustPositionForNewDimensions(
oldPosition: oldPosition,
newPosition: newPosition,
isScrolling: isScrolling,
velocity: velocity,
);
}
}