runSettleAnimation method

Future<void> runSettleAnimation({
  1. required TickerProvider vsync,
  2. required double startValue,
  3. double targetValue = 0,
  4. required double initialVelocity,
  5. required ValueChanged<double> onFrame,
  6. VoidCallback? onSettle,
})

使用 Ticker 驱动到平衡,并在每帧调用 onFrame

onSettle 无论正常结束还是 Ticker 被取消都会在清理阶段调用。

Implementation

Future<void> runSettleAnimation({
  required TickerProvider vsync,
  required double startValue,
  double targetValue = 0,
  required double initialVelocity,
  required ValueChanged<double> onFrame,
  VoidCallback? onSettle,
}) async {
  start(
    startValue: startValue,
    targetValue: targetValue,
    initialVelocity: initialVelocity,
  );
  final completer = Completer<void>();
  Duration? previousElapsed;
  late final Ticker ticker;
  ticker = vsync.createTicker((elapsed) {
    final previous = previousElapsed;
    previousElapsed = elapsed;
    if (previous == null) return;
    final finished = step(
      (elapsed - previous).inMicroseconds / Duration.microsecondsPerSecond,
    );
    onFrame(currentPosition);
    if (finished) {
      ticker.stop();
      if (!completer.isCompleted) completer.complete();
    }
  });
  ticker.start();
  try {
    await completer.future;
  } finally {
    ticker.dispose();
    onSettle?.call();
  }
}