You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.0 KiB
Dart
63 lines
2.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter/physics.dart';
|
|
|
|
/// Reusable spring route
|
|
class CustomPageRoute<T> extends PageRouteBuilder<T> {
|
|
final Widget page;
|
|
final AxisDirection direction;
|
|
final bool fullScreenDialog;
|
|
|
|
CustomPageRoute({required this.page, this.direction = AxisDirection.right, this.fullScreenDialog = false})
|
|
: super(
|
|
transitionDuration: const Duration(milliseconds: 1500),
|
|
reverseTransitionDuration: const Duration(milliseconds: 500),
|
|
fullscreenDialog: fullScreenDialog,
|
|
pageBuilder: (_, __, ___) => page,
|
|
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
|
final spring = SpringDescription(mass: 1, stiffness: 100, damping: 15);
|
|
|
|
// Drive animation with spring
|
|
final curvedAnimation = animation.drive(
|
|
Tween<double>(begin: 0.0, end: 1.0).chain(CurveTween(curve: _SpringCurve(spring))),
|
|
);
|
|
|
|
// Choose offset based on direction
|
|
Offset beginOffset;
|
|
switch (direction) {
|
|
case AxisDirection.left:
|
|
beginOffset = const Offset(-1.0, 0.0);
|
|
break;
|
|
case AxisDirection.right:
|
|
beginOffset = const Offset(1.0, 0.0);
|
|
break;
|
|
case AxisDirection.up:
|
|
beginOffset = const Offset(0.0, -1.0);
|
|
break;
|
|
case AxisDirection.down:
|
|
beginOffset = const Offset(0.0, 1.0);
|
|
break;
|
|
}
|
|
|
|
final offsetAnimation = Tween<Offset>(begin: beginOffset, end: Offset.zero).animate(curvedAnimation);
|
|
|
|
return SlideTransition(
|
|
position: offsetAnimation,
|
|
child: child,
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
/// Custom spring curve
|
|
class _SpringCurve extends Curve {
|
|
final SpringDescription spring;
|
|
|
|
_SpringCurve(this.spring);
|
|
|
|
@override
|
|
double transform(double t) {
|
|
final sim = SpringSimulation(spring, 0, 1, 0);
|
|
return sim.x(t * 1.5); // scaled time
|
|
}
|
|
}
|