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.
		
		
		
		
		
			
		
			
	
	
		
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Dart
		
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Dart
		
	
| 
											1 month ago
										 | import 'package:flutter/material.dart'; | ||
|  | import 'package:flutter/physics.dart'; | ||
|  | 
 | ||
|  | /// Reusable spring route
 | ||
|  | class CustomPageRoute extends PageRouteBuilder { | ||
|  |   final Widget page; | ||
|  |   final AxisDirection direction; | ||
|  | 
 | ||
|  |   CustomPageRoute({required this.page, this.direction = AxisDirection.right}) | ||
|  |       : super( | ||
|  |           transitionDuration: const Duration(milliseconds: 1000), | ||
|  |           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
 | ||
|  |   } | ||
|  | } |