Experimental flags for hot reloads, fixed (#27043)

* Revert "Revert "Experimental flags for hot reloads (#26988)" (#27037)"

This reverts commit cf7441983e9df7ed7172abf6d083e0c488860c5c.

* Fix analysis failures
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index 16b764e..679120f 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -333,6 +333,11 @@
       throwToolExit('Error: --train is only allowed when running as --dynamic --profile '
           '(recommended) or --debug (may include unwanted debug symbols).');
 
+    List<String> expFlags;
+    if (argParser.options.containsKey(FlutterOptions.kEnableExperiment) &&
+        argResults[FlutterOptions.kEnableExperiment] != null) {
+      expFlags = argResults[FlutterOptions.kEnableExperiment];
+    }
     final List<FlutterDevice> flutterDevices = devices.map<FlutterDevice>((Device device) {
       return FlutterDevice(
         device,
@@ -341,6 +346,7 @@
         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 eb584a1..82254de 100644
--- a/packages/flutter_tools/lib/src/compile.dart
+++ b/packages/flutter_tools/lib/src/compile.dart
@@ -332,7 +332,8 @@
     CompilerMessageConsumer compilerMessageConsumer = printError,
     String initializeFromDill,
     TargetModel targetModel = TargetModel.flutter,
-    bool unsafePackageSerialization
+    bool unsafePackageSerialization,
+    List<String> experimentalFlags,
   }) : assert(_sdkRoot != null),
        _trackWidgetCreation = trackWidgetCreation,
        _packagesPath = packagesPath,
@@ -342,7 +343,8 @@
        _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/';
@@ -358,6 +360,7 @@
   final _StdoutHandler _stdoutHandler;
   String _initializeFromDill;
   bool _unsafePackageSerialization;
+  final List<String> _experimentalFlags;
 
   final StreamController<_CompilationRequest> _controller;
 
@@ -470,6 +473,10 @@
     if (_unsafePackageSerialization == true) {
       command.add('--unsafe-package-serialization');
     }
+    if (_experimentalFlags != null) {
+      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 eecb057..75e8b9c 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -35,6 +35,7 @@
     this.fileSystemScheme,
     this.viewFilter,
     TargetModel targetModel = TargetModel.flutter,
+    List<String> experimentalFlags,
     ResidentCompiler generator,
   }) : assert(trackWidgetCreation != null),
        generator = generator ?? ResidentCompiler(
@@ -43,6 +44,7 @@
          fileSystemRoots: fileSystemRoots,
          fileSystemScheme: fileSystemScheme,
          targetModel: targetModel,
+         experimentalFlags: experimentalFlags,
        );
 
   final Device device;