run method

Future<SdkResult<void>> run(
  1. SceneTransitionLoad load
)

Implementation

Future<SdkResult<void>> run(SceneTransitionLoad load) async {
  if (_disposed) {
    return const SdkFailure(
      kind: SdkErrorKind.unknown,
      message: 'SceneTransitionController already disposed',
    );
  }

  final token = ++_tokenCounter;
  _activeToken = token;
  progress.value = 0.0;
  lastError = null;
  phase.value = SceneTransitionPhase.covering;

  await Future<void>.delayed(coverDuration);
  if (!_isCurrent(token)) {
    return const SdkFailure(
      kind: SdkErrorKind.unknown,
      message: 'Transition superseded before loading started',
    );
  }

  phase.value = SceneTransitionPhase.loading;
  final SdkResult<void> result;
  try {
    result = await load((value) {
      if (_isCurrent(token)) progress.value = value.clamp(0.0, 1.0);
    });
  } catch (error, stack) {
    final failure = SdkFailure<void>(
      kind: SdkErrorKind.unknown,
      message: 'Scene transition load callback threw: $error',
      cause: error,
      stackTrace: stack,
    );
    if (!_isCurrent(token)) return failure;
    lastError = failure;
    phase.value = SceneTransitionPhase.error;
    return failure;
  }

  if (!_isCurrent(token)) return result;

  if (result is SdkFailure<void>) {
    lastError = result;
    phase.value = SceneTransitionPhase.error;
    return result;
  }

  phase.value = SceneTransitionPhase.revealing;
  await Future<void>.delayed(revealDuration);
  if (_isCurrent(token)) {
    phase.value = SceneTransitionPhase.idle;
    _activeToken = null;
  }
  return result;
}