mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
98 lines
2.6 KiB
Dart
98 lines
2.6 KiB
Dart
import 'package:PiliPlus/utils/storage.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
Widget videoTabBarView({
|
|
required List<Widget> children,
|
|
TabController? controller,
|
|
}) =>
|
|
TabBarView(
|
|
physics: const CustomTabBarViewClampingScrollPhysics(),
|
|
controller: controller,
|
|
children: children,
|
|
);
|
|
|
|
Widget tabBarView({
|
|
required List<Widget> children,
|
|
TabController? controller,
|
|
}) =>
|
|
TabBarView(
|
|
physics: const CustomTabBarViewScrollPhysics(),
|
|
controller: controller,
|
|
children: children,
|
|
);
|
|
|
|
class CustomTabBarViewScrollPhysics extends ScrollPhysics {
|
|
const CustomTabBarViewScrollPhysics({super.parent});
|
|
|
|
@override
|
|
CustomTabBarViewScrollPhysics applyTo(ScrollPhysics? ancestor) {
|
|
return CustomTabBarViewScrollPhysics(parent: buildParent(ancestor));
|
|
}
|
|
|
|
@override
|
|
SpringDescription get spring => CustomSpringDescription();
|
|
}
|
|
|
|
class CustomTabBarViewClampingScrollPhysics extends ClampingScrollPhysics {
|
|
const CustomTabBarViewClampingScrollPhysics({super.parent});
|
|
|
|
@override
|
|
CustomTabBarViewClampingScrollPhysics applyTo(ScrollPhysics? ancestor) {
|
|
return CustomTabBarViewClampingScrollPhysics(parent: buildParent(ancestor));
|
|
}
|
|
|
|
@override
|
|
SpringDescription get spring => CustomSpringDescription();
|
|
}
|
|
|
|
class PositionRetainedScrollPhysics extends AlwaysScrollableScrollPhysics {
|
|
const PositionRetainedScrollPhysics({super.parent, this.shouldRetain = true});
|
|
|
|
final bool shouldRetain;
|
|
|
|
@override
|
|
PositionRetainedScrollPhysics applyTo(ScrollPhysics? ancestor) {
|
|
return PositionRetainedScrollPhysics(parent: buildParent(ancestor));
|
|
}
|
|
|
|
@override
|
|
double adjustPositionForNewDimensions({
|
|
required ScrollMetrics oldPosition,
|
|
required ScrollMetrics newPosition,
|
|
required bool isScrolling,
|
|
required double velocity,
|
|
}) {
|
|
final position = super.adjustPositionForNewDimensions(
|
|
oldPosition: oldPosition,
|
|
newPosition: newPosition,
|
|
isScrolling: isScrolling,
|
|
velocity: velocity,
|
|
);
|
|
|
|
late final diff = newPosition.maxScrollExtent - oldPosition.maxScrollExtent;
|
|
|
|
if (shouldRetain && oldPosition.pixels == 0 && diff > 0) {
|
|
return position + diff;
|
|
} else {
|
|
return position;
|
|
}
|
|
}
|
|
}
|
|
|
|
class CustomSpringDescription implements SpringDescription {
|
|
@override
|
|
final mass = GStorage.springDescription[0];
|
|
|
|
@override
|
|
final stiffness = GStorage.springDescription[1];
|
|
|
|
@override
|
|
final damping = GStorage.springDescription[2];
|
|
|
|
CustomSpringDescription._();
|
|
|
|
static final _instance = CustomSpringDescription._();
|
|
|
|
factory CustomSpringDescription() => _instance;
|
|
}
|