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
 | 
						|
  }
 | 
						|
}
 |