diff --git a/packages/flutter_tools/lib/src/debug_adapters/flutter_adapter.dart b/packages/flutter_tools/lib/src/debug_adapters/flutter_adapter.dart index 231c3f563bc..4bf367003c3 100644 --- a/packages/flutter_tools/lib/src/debug_adapters/flutter_adapter.dart +++ b/packages/flutter_tools/lib/src/debug_adapters/flutter_adapter.dart @@ -663,6 +663,12 @@ class FlutterDebugAdapter extends FlutterBaseDebugAdapter { bool fullRestart, [ String? reason, ]) async { + // Don't do anything if the app hasn't started yet, as restarts and reloads + // can only operate on a running app. + if (_appId == null) { + return; + } + final String progressId = fullRestart ? 'hotRestart' : 'hotReload'; final String progressMessage = fullRestart ? 'Hot restarting…' : 'Hot reloading…'; final DapProgressReporter progress = startProgressNotification( diff --git a/packages/flutter_tools/test/general.shard/dap/flutter_adapter_test.dart b/packages/flutter_tools/test/general.shard/dap/flutter_adapter_test.dart index c6d347d28c9..a76b9fd20e4 100644 --- a/packages/flutter_tools/test/general.shard/dap/flutter_adapter_test.dart +++ b/packages/flutter_tools/test/general.shard/dap/flutter_adapter_test.dart @@ -186,6 +186,30 @@ void main() { expect(adapter.dapToFlutterRequests, isNot(contains('app.stop'))); }); + test('does not call "app.restart" before app has been started', () async { + final MockFlutterDebugAdapter adapter = MockFlutterDebugAdapter( + fileSystem: MemoryFileSystem.test(style: fsStyle), + platform: platform, + simulateAppStarted: false, + ); + + final Completer launchCompleter = Completer(); + final FlutterLaunchRequestArguments launchArgs = FlutterLaunchRequestArguments( + cwd: '/project', + program: 'foo.dart', + ); + final Completer restartCompleter = Completer(); + final RestartArguments restartArgs = RestartArguments(); + + await adapter.configurationDoneRequest(MockRequest(), null, () {}); + await adapter.launchRequest(MockRequest(), launchArgs, launchCompleter.complete); + await launchCompleter.future; + await adapter.restartRequest(MockRequest(), restartArgs, restartCompleter.complete); + await restartCompleter.future; + + expect(adapter.dapToFlutterRequests, isNot(contains('app.restart'))); + }); + test('includes Dart Debug extension progress update', () async { final MockFlutterDebugAdapter adapter = MockFlutterDebugAdapter( fileSystem: MemoryFileSystem.test(style: fsStyle),