diff --git a/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart b/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart index 1ec5de4f2c1..b4016d52862 100644 --- a/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart +++ b/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart @@ -36,6 +36,7 @@ class DwdsWebRunnerFactory extends WebRunnerFactory { ResidentRunner createWebRunner( Device device, { String target, + @required bool stayResident, @required FlutterProject flutterProject, @required bool ipv6, @required DebuggingOptions debuggingOptions, @@ -46,6 +47,7 @@ class DwdsWebRunnerFactory extends WebRunnerFactory { flutterProject: flutterProject, debuggingOptions: debuggingOptions, ipv6: ipv6, + stayResident: stayResident, ); } } @@ -57,12 +59,13 @@ class ResidentWebRunner extends ResidentRunner { @required this.flutterProject, @required bool ipv6, @required DebuggingOptions debuggingOptions, + bool stayResident = true, }) : super( [], target: target ?? fs.path.join('lib', 'main.dart'), debuggingOptions: debuggingOptions, ipv6: ipv6, - stayResident: true, + stayResident: stayResident, ); final Device device; @@ -316,9 +319,15 @@ class ResidentWebRunner extends ResidentRunner { connectionInfoCompleter?.complete( DebugConnectionInfo(wsUri: websocketUri) ); - final int result = await waitForAppToFinish(); + + if (stayResident) { + await waitForAppToFinish(); + } else { + await stopEchoingDeviceLog(); + await exitApp(); + } await cleanupAtFinish(); - return result; + return 0; } @override diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index 56524783bc1..7c4286dbf63 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart @@ -435,6 +435,7 @@ class AppDomain extends Domain { target: target, debuggingOptions: options, ipv6: ipv6, + stayResident: true, ); } else if (enableHotReload) { runner = HotRunner( diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index 861e5d36719..fd6dc5386ab 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -457,6 +457,7 @@ class RunCommand extends RunCommandBase { flutterProject: flutterProject, ipv6: ipv6, debuggingOptions: _createDebuggingOptions(), + stayResident: stayResident, ); } else { runner = ColdRunner( diff --git a/packages/flutter_tools/lib/src/web/web_runner.dart b/packages/flutter_tools/lib/src/web/web_runner.dart index df5d87d828c..b87db3083bd 100644 --- a/packages/flutter_tools/lib/src/web/web_runner.dart +++ b/packages/flutter_tools/lib/src/web/web_runner.dart @@ -19,6 +19,7 @@ abstract class WebRunnerFactory { ResidentRunner createWebRunner( Device device, { String target, + @required bool stayResident, @required FlutterProject flutterProject, @required bool ipv6, @required DebuggingOptions debuggingOptions, diff --git a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart index f6b631c85b9..70a4d1de12a 100644 --- a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart @@ -154,6 +154,19 @@ void main() { Logger: () => DelegateLogger(BufferLogger()), })); + test('Can successfully run and disconnect with --no-resident', () => testbed.run(() async { + _setupMocks(); + residentWebRunner = ResidentWebRunner( + mockWebDevice, + flutterProject: FlutterProject.current(), + debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), + ipv6: true, + stayResident: false, + ); + + expect(await residentWebRunner.run(), 0); + })); + test('Listens to stdout streams before running main', () => testbed.run(() async { _setupMocks(); final BufferLogger bufferLogger = logger;