AnimationTimeline.cascade constructor
AnimationTimeline.cascade({
- required List<
AnimationController> controllers, - Duration hold = Duration.zero,
- Duration gap = Duration.zero,
- Duration rest = Duration.zero,
- bool repeat = false,
- bool alternate = false,
- Object? id,
- String labelBuilder()?,
- void onStepStart(
- int index,
- AnimationTimelineStep step,
- TimelineDirection direction
- void onStepComplete(
- int index,
- AnimationTimelineStep step,
- TimelineDirection direction
Builds a serial pulse choreography across multiple controllers.
Each controller runs through:
- animate forward
- optional
hold - animate reverse
A gap is inserted between controllers, and an optional rest is
inserted after the final controller before the next repeated cycle.
Implementation
factory AnimationTimeline.cascade({
required List<AnimationController> controllers,
Duration hold = Duration.zero,
Duration gap = Duration.zero,
Duration rest = Duration.zero,
bool repeat = false,
bool alternate = false,
Object? id,
String Function(int index, String phase)? labelBuilder,
void Function(
int index,
AnimationTimelineStep step,
TimelineDirection direction,
)?
onStepStart,
void Function(
int index,
AnimationTimelineStep step,
TimelineDirection direction,
)?
onStepComplete,
}) {
if (controllers.isEmpty) {
throw ArgumentError.value(
controllers,
'controllers',
'must not be empty',
);
}
final steps = <AnimationTimelineStep>[];
for (var index = 0; index < controllers.length; index++) {
final controller = controllers[index];
steps.add(
AnimationTimelineStep.forward(
controller,
label: labelBuilder?.call(index, 'in') ?? 'cascade-in-$index',
),
);
if (hold > Duration.zero) {
steps.add(
AnimationTimelineStep.delay(
hold,
label: labelBuilder?.call(index, 'hold') ?? 'cascade-hold-$index',
),
);
}
steps.add(
AnimationTimelineStep.reverse(
controller,
label: labelBuilder?.call(index, 'out') ?? 'cascade-out-$index',
),
);
if (index < controllers.length - 1 && gap > Duration.zero) {
steps.add(
AnimationTimelineStep.delay(
gap,
label: labelBuilder?.call(index, 'gap') ?? 'cascade-gap-$index',
),
);
}
}
if (rest > Duration.zero) {
steps.add(
AnimationTimelineStep.delay(
rest,
label:
labelBuilder?.call(controllers.length - 1, 'rest') ??
'cascade-rest',
),
);
}
return AnimationTimeline(
steps: steps,
repeat: repeat,
alternate: alternate,
id: id,
onStepStart: onStepStart,
onStepComplete: onStepComplete,
);
}