profile wallet linked with view model.
parent
c83754fc4a
commit
c00e69ef0c
@ -0,0 +1,59 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,38 @@
|
||||
import 'package:flutter/physics.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
PageRouteBuilder springPageRoute(Widget page) {
|
||||
return PageRouteBuilder(
|
||||
pageBuilder: (_, __, ___) => page,
|
||||
transitionDuration: const Duration(milliseconds: 1000),
|
||||
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
||||
final spring = SpringDescription(mass: 1, stiffness: 100, damping: 15);
|
||||
|
||||
final curvedAnimation = animation.drive(
|
||||
Tween<double>(begin: 0.0, end: 1.0).chain(CurveTween(curve: _SpringCurve(spring))),
|
||||
);
|
||||
|
||||
final offsetAnimation = Tween<Offset>(
|
||||
begin: const Offset(-1.0, 0.0), // slide from left
|
||||
end: Offset.zero,
|
||||
).animate(curvedAnimation);
|
||||
|
||||
return SlideTransition(
|
||||
position: offsetAnimation,
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
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); // scale time so it completes properly
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue