delayedAnimation function
returns an animation with duration broader, but doesn't raise from 0 until broader - duration, meaning that it will appear as if it runs for duration after a delay. We do it this way instead of specifying {delay, duration} because flutter requires the duration to have been decided generally before you receive an animation, so this ends up being more succinct/parametizable.
Implementation
Animation<double> delayedAnimation(Animation<double> animation,
{required Duration duration, required Duration within}) {
final curve = Interval(
(within.inMilliseconds - duration.inMilliseconds) / within.inMilliseconds,
1.0);
return CurvedAnimation(parent: animation, curve: curve);
}