diff --git a/packages/flutter_tools/lib/src/features.dart b/packages/flutter_tools/lib/src/features.dart index 3caf9a945d..05aff3c6e6 100644 --- a/packages/flutter_tools/lib/src/features.dart +++ b/packages/flutter_tools/lib/src/features.dart @@ -34,6 +34,9 @@ class FeatureFlags { /// Whether flutter desktop for Windows is enabled. bool get isWindowsEnabled => isEnabled(flutterWindowsDesktopFeature); + /// Whether fast single widget reloads are enabled. + bool get isSingleWidgetReloadEnabled => isEnabled(singleWidgetReload); + /// Whether a particular feature is enabled for the current channel. /// /// Prefer using one of the specific getters above instead of this API. @@ -65,6 +68,7 @@ const List allFeatures = [ flutterLinuxDesktopFeature, flutterMacOSDesktopFeature, flutterWindowsDesktopFeature, + singleWidgetReload, ]; /// The [Feature] for flutter web. @@ -127,6 +131,28 @@ const Feature flutterWindowsDesktopFeature = Feature( ), ); +/// The fast hot reload feature for https://github.com/flutter/flutter/issues/61407. +const Feature singleWidgetReload = Feature( + name: 'Hot reload optimization for changes to class body of a single widget', + configSetting: 'single-widget-reload-optimization', + master: FeatureChannelSetting( + available: true, + enabledByDefault: false, + ), + dev: FeatureChannelSetting( + available: true, + enabledByDefault: false, + ), + beta: FeatureChannelSetting( + available: true, + enabledByDefault: false, + ), + stable: FeatureChannelSetting( + available: true, + enabledByDefault: false, + ), +); + /// A [Feature] is a process for conditionally enabling tool features. /// /// All settings are optional, and if not provided will generally default to diff --git a/packages/flutter_tools/test/integration.shard/command_output_test.dart b/packages/flutter_tools/test/integration.shard/command_output_test.dart index bd1ab21a31..8694462fe5 100644 --- a/packages/flutter_tools/test/integration.shard/command_output_test.dart +++ b/packages/flutter_tools/test/integration.shard/command_output_test.dart @@ -4,6 +4,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; +import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:process/process.dart'; @@ -55,6 +56,20 @@ void main() { expect(result.stdout, contains('Running shutdown hooks')); }); + test('flutter config contains all features', () async { + final String flutterBin = globals.fs.path.join(getFlutterRoot(), 'bin', 'flutter'); + final ProcessResult result = await const LocalProcessManager().run([ + flutterBin, + 'config', + ]); + + // contains all of the experiments in features.dart + expect(result.stdout.split('\n'), containsAll([ + for (final Feature feature in allFeatures) + contains(feature.configSetting), + ])); + }); + test('flutter run --machine uses AppRunLogger', () async { final Directory directory = createResolvedTempDirectorySync('flutter_run_test.') .createTempSync('_flutter_run_test.') diff --git a/packages/flutter_tools/test/src/testbed.dart b/packages/flutter_tools/test/src/testbed.dart index 62a1e31914..0dae9c4921 100644 --- a/packages/flutter_tools/test/src/testbed.dart +++ b/packages/flutter_tools/test/src/testbed.dart @@ -724,6 +724,7 @@ class TestFeatureFlags implements FeatureFlags { this.isMacOSEnabled = false, this.isWebEnabled = false, this.isWindowsEnabled = false, + this.isSingleWidgetReloadEnabled = false, }); @override @@ -738,6 +739,9 @@ class TestFeatureFlags implements FeatureFlags { @override final bool isWindowsEnabled; + @override + final bool isSingleWidgetReloadEnabled; + @override bool isEnabled(Feature feature) { switch (feature) {