run method
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;
}