staggered static method

List<Widget> staggered({
  1. required List<Widget> children,
  2. required Map<MontageAnimation, MotionWidgetBuilder> motion(
    1. Widget widget,
    2. int i,
    3. Curve forward,
    4. Curve backward,
    ),
  3. MotionWidgetBuilder? fallback,
  4. double overlap = 0,
  5. double start = 0.0,
  6. double end = 1.0,
})

Implementation

static List<Widget> staggered({
  required List<Widget> children,
  required Map<MontageAnimation, MotionWidgetBuilder> motion(
    Widget widget,
    int i,
    Curve forward,
    Curve backward,
  ),
  MotionWidgetBuilder? fallback,
  double overlap = 0,
  double start = 0.0,
  double end = 1.0,
}) {
  final result = <Widget>[];

  final totalDuration =
      children.length.toDouble() - (children.length - 1) * overlap;
  for (var i = 0; i < children.length; i++) {
    final child = children[i];
    final childStart = (i - i * overlap) / totalDuration;
    final childEnd = (i - (i * overlap) + 1) / totalDuration;

    final interval = Interval(
      start,
      end,
      curve: Interval(
        childStart,
        childEnd,
      ),
    );
    final childMotion = motion(
      child,
      i,
      interval,
      interval.flipped,
    );

    result.add(
      Motion(
        fallback: fallback ?? defaultMotionFallbackBuilder,
        motion: childMotion,
        child: child,
      ),
    );
  }

  return result;
}