diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index fe4d414163..cc65f6f95e 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -115,7 +115,14 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment help: 'Filters out all trace events except those that are specified in ' 'this comma separated list of allowed prefixes.', valueHelp: 'foo,bar', - ); + ) + ..addMultiOption('dart-entrypoint-args', + abbr: 'a', + help: 'Pass a list of arguments to the Dart entrypoint at application ' + 'startup. By default this is main(List args). Specify ' + 'this option multiple times each with one argument to pass ' + 'multiple arguments to the Dart entrypoint. Currently this is ' + 'only supported on desktop platforms.'); usesWebOptions(hide: !verboseHelp); usesTargetOption(); usesPortOptions(); @@ -153,6 +160,7 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment if (buildInfo.mode.isRelease) { return DebuggingOptions.disabled( buildInfo, + dartEntrypointArgs: stringsArg('dart-entrypoint-args'), hostname: featureFlags.isWebEnabled ? stringArg('web-hostname') : '', port: featureFlags.isWebEnabled ? stringArg('web-port') : '', webUseSseForDebugProxy: featureFlags.isWebEnabled && stringArg('web-server-debug-protocol') == 'sse', @@ -167,6 +175,7 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment startPaused: boolArg('start-paused'), disableServiceAuthCodes: boolArg('disable-service-auth-codes'), disableDds: boolArg('disable-dds'), + dartEntrypointArgs: stringsArg('dart-entrypoint-args'), dartFlags: stringArg('dart-flags') ?? '', useTestFonts: argParser.options.containsKey('use-test-fonts') && boolArg('use-test-fonts'), enableSoftwareRendering: argParser.options.containsKey('enable-software-rendering') && boolArg('enable-software-rendering'), diff --git a/packages/flutter_tools/lib/src/desktop_device.dart b/packages/flutter_tools/lib/src/desktop_device.dart index e771a7fd33..6b4d9322f7 100644 --- a/packages/flutter_tools/lib/src/desktop_device.dart +++ b/packages/flutter_tools/lib/src/desktop_device.dart @@ -139,6 +139,7 @@ abstract class DesktopDevice extends Device { final Process process = await _processManager.start( [ executable, + ...?debuggingOptions?.dartEntrypointArgs, ], environment: _computeEnvironment(debuggingOptions, traceStartup, route), ); diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index e01880552a..53932d7c16 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -835,6 +835,7 @@ class DebuggingOptions { this.startPaused = false, this.disableServiceAuthCodes = false, this.disableDds = false, + this.dartEntrypointArgs = const [], this.dartFlags = '', this.enableSoftwareRendering = false, this.skiaDeterministicRendering = false, @@ -865,6 +866,7 @@ class DebuggingOptions { }) : debuggingEnabled = true; DebuggingOptions.disabled(this.buildInfo, { + this.dartEntrypointArgs = const [], this.port, this.hostname, this.webEnableExposeUrl, @@ -902,6 +904,7 @@ class DebuggingOptions { final BuildInfo buildInfo; final bool startPaused; final String dartFlags; + final List dartEntrypointArgs; final bool disableServiceAuthCodes; final bool disableDds; final bool enableSoftwareRendering; diff --git a/packages/flutter_tools/test/general.shard/desktop_device_test.dart b/packages/flutter_tools/test/general.shard/desktop_device_test.dart index 11f4d28a4e..8b87d39f1f 100644 --- a/packages/flutter_tools/test/general.shard/desktop_device_test.dart +++ b/packages/flutter_tools/test/general.shard/desktop_device_test.dart @@ -247,6 +247,29 @@ void main() { expect(device.createDevFSWriter(null, ''), isA()); }); + + testWithoutContext('startApp supports dartEntrypointArgs', () async { + final Completer completer = Completer(); + final FakeProcessManager processManager = FakeProcessManager.list([ + FakeCommand( + command: const ['debug', 'arg1', 'arg2'], + stdout: 'Observatory listening on http://127.0.0.1/0\n', + completer: completer + ), + ]); + final FakeDesktopDevice device = setUpDesktopDevice(processManager: processManager); + final FakeApplicationPackage package = FakeApplicationPackage(); + final LaunchResult result = await device.startApp( + package, + prebuiltApplication: true, + debuggingOptions: DebuggingOptions.enabled( + BuildInfo.debug, + dartEntrypointArgs: ['arg1', 'arg2'] + ), + ); + + expect(result.started, true); + }); } FakeDesktopDevice setUpDesktopDevice({