diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index 352d819850f..d45e43bde72 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -339,6 +339,12 @@ class RunCommand extends RunCommandBase { throwToolExit('Error: --train is only allowed when running as --dynamic --profile ' '(recommended) or --debug (may include unwanted debug symbols).'); + List expFlags; + if (argParser.options.containsKey(FlutterOptions.kEnableExperiment) && + argResults[FlutterOptions.kEnableExperiment].isNotEmpty) { + expFlags = argResults[FlutterOptions.kEnableExperiment]; + } + final List flutterDevices = devices.map((Device device) { return FlutterDevice( device, @@ -347,6 +353,7 @@ class RunCommand extends RunCommandBase { fileSystemRoots: argResults['filesystem-root'], fileSystemScheme: argResults['filesystem-scheme'], viewFilter: argResults['isolate-filter'], + experimentalFlags: expFlags, ); }).toList(); diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart index 3a24d542092..55cf43e85d8 100644 --- a/packages/flutter_tools/lib/src/compile.dart +++ b/packages/flutter_tools/lib/src/compile.dart @@ -341,7 +341,8 @@ class ResidentCompiler { CompilerMessageConsumer compilerMessageConsumer = printError, String initializeFromDill, TargetModel targetModel = TargetModel.flutter, - bool unsafePackageSerialization + bool unsafePackageSerialization, + List experimentalFlags, }) : assert(_sdkRoot != null), _trackWidgetCreation = trackWidgetCreation, _packagesPath = packagesPath, @@ -351,7 +352,8 @@ class ResidentCompiler { _stdoutHandler = StdoutHandler(consumer: compilerMessageConsumer), _controller = StreamController<_CompilationRequest>(), _initializeFromDill = initializeFromDill, - _unsafePackageSerialization = unsafePackageSerialization { + _unsafePackageSerialization = unsafePackageSerialization, + _experimentalFlags = experimentalFlags { // This is a URI, not a file path, so the forward slash is correct even on Windows. if (!_sdkRoot.endsWith('/')) _sdkRoot = '$_sdkRoot/'; @@ -367,6 +369,7 @@ class ResidentCompiler { final StdoutHandler _stdoutHandler; String _initializeFromDill; bool _unsafePackageSerialization; + final List _experimentalFlags; final StreamController<_CompilationRequest> _controller; @@ -479,6 +482,10 @@ class ResidentCompiler { if (_unsafePackageSerialization == true) { command.add('--unsafe-package-serialization'); } + if ((_experimentalFlags != null) && _experimentalFlags.isNotEmpty) { + final String expFlags = _experimentalFlags.join(','); + command.add('--enable-experiment=$expFlags'); + } printTrace(command.join(' ')); _server = await processManager.start(command); _server.stdout diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 12ccd7b8d45..bba0e4dda21 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -35,6 +35,7 @@ class FlutterDevice { this.fileSystemScheme, this.viewFilter, TargetModel targetModel = TargetModel.flutter, + List experimentalFlags, ResidentCompiler generator, }) : assert(trackWidgetCreation != null), generator = generator ?? ResidentCompiler( @@ -43,6 +44,7 @@ class FlutterDevice { fileSystemRoots: fileSystemRoots, fileSystemScheme: fileSystemScheme, targetModel: targetModel, + experimentalFlags: experimentalFlags, ); final Device device;