diff --git a/lib/src/model/analysis/retro_controller.dart b/lib/src/model/analysis/retro_controller.dart index 7e2096c042..ca703cde93 100644 --- a/lib/src/model/analysis/retro_controller.dart +++ b/lib/src/model/analysis/retro_controller.dart @@ -113,8 +113,24 @@ class RetroController extends AsyncNotifier with EngineEvaluationMix _root = _game.makeTree(); if (_game.serverAnalysis == null) { + // Add listener before requesting analysis to avoid missing events + // that arrive between the request and listener registration. + serverAnalysisService.lastAnalysisEvent.addListener(_listenToServerAnalysisEvents); + await serverAnalysisService.requestAnalysis(options.id); + // Check if analysis already completed (e.g. was requested from the + // analysis screen and finished before we started listening). + final existingEvent = serverAnalysisService.lastAnalysisEvent.value; + if (existingEvent != null && + existingEvent.$1 == options.id && + existingEvent.$2.isAnalysisComplete) { + ServerAnalysisService.mergeOngoingAnalysis(_root, existingEvent.$2.tree); + state = AsyncData(await _computeMistakes(options.initialSide)); + requestEval(); + return state.requireValue; + } + _serverAnalysisCompleter.future.timeout( kMaxWaitForServerAnalysis, onTimeout: () { @@ -148,8 +164,6 @@ class RetroController extends AsyncNotifier with EngineEvaluationMix state = AsyncValue.data(retroState); - serverAnalysisService.lastAnalysisEvent.addListener(_listenToServerAnalysisEvents); - return retroState; }