Do not continue a hot restart if _restartFromSources fails (#22645)
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index 35d5f92..2f68bb5 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -502,7 +502,9 @@ try { if (!(await hotRunnerConfig.setupHotRestart())) return OperationResult(1, 'setupHotRestart failed'); - await _restartFromSources(); + final OperationResult result = await _restartFromSources(); + if (!result.isOk) + return result; } finally { status.cancel(); }
diff --git a/packages/flutter_tools/test/hot_test.dart b/packages/flutter_tools/test/hot_test.dart index 0094422..4ee6ec4 100644 --- a/packages/flutter_tools/test/hot_test.dart +++ b/packages/flutter_tools/test/hot_test.dart
@@ -103,14 +103,16 @@ testUsingContext('no setup', () async { final List<FlutterDevice> devices = <FlutterDevice>[FlutterDevice(MockDevice(), generator: residentCompiler, trackWidgetCreation: false)]; - expect((await HotRunner(devices).restart(fullRestart: true)).isOk, true); + expect((await HotRunner(devices).restart(fullRestart: true)).isOk, false); }, overrides: <Type, Generator>{ Artifacts: () => mockArtifacts, }); testUsingContext('setup function succeeds', () async { final List<FlutterDevice> devices = <FlutterDevice>[FlutterDevice(MockDevice(), generator: residentCompiler, trackWidgetCreation: false)]; - expect((await HotRunner(devices).restart(fullRestart: true)).isOk, true); + final OperationResult result = await HotRunner(devices).restart(fullRestart: true); + expect(result.isOk, false); + expect(result.message, isNot('setupHotRestart failed')); }, overrides: <Type, Generator>{ Artifacts: () => mockArtifacts, HotRunnerConfig: () => TestHotRunnerConfig(successfulSetup: true), @@ -118,7 +120,9 @@ testUsingContext('setup function fails', () async { final List<FlutterDevice> devices = <FlutterDevice>[FlutterDevice(MockDevice(), generator: residentCompiler, trackWidgetCreation: false)]; - expect((await HotRunner(devices).restart(fullRestart: true)).isOk, false); + final OperationResult result = await HotRunner(devices).restart(fullRestart: true); + expect(result.isOk, false); + expect(result.message, 'setupHotRestart failed'); }, overrides: <Type, Generator>{ Artifacts: () => mockArtifacts, HotRunnerConfig: () => TestHotRunnerConfig(successfulSetup: false),