From 559dc783eca09bc4cf742fc6193cf191c084f128 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 10 Dec 2025 14:36:55 -0800 Subject: [PATCH 1/7] Initial changes --- .../lib/src/screens/inspector/inspector_screen_body.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart index ac6cd1854b0..6d711773136 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart @@ -20,6 +20,7 @@ import '../../shared/managers/error_badge_manager.dart'; import '../../shared/primitives/blocking_action_mixin.dart'; import '../../shared/ui/common_widgets.dart'; import '../../shared/ui/search.dart'; +import '../../shared/utils/utils.dart'; import '../inspector_shared/inspector_controls.dart'; import '../inspector_shared/inspector_screen.dart'; import '../inspector_shared/inspector_settings_dialog.dart'; @@ -111,6 +112,8 @@ class InspectorScreenBodyState extends State } _summaryTreeController.setSearchTarget(searchTarget); + + safeUnawaited(_showLegacyInspectorWarning(context)); } @override @@ -218,6 +221,12 @@ class InspectorScreenBodyState extends State _summaryTreeController.resetSearch(); } + void _showLegacyInspectorWarning(BuildContext context) { + if (context.mounted) { + pushLegacyInspectorWarning(InspectorScreen.id); + } + } + List getServiceExtensionWidgets() { return [ ServiceExtensionButtonGroup( From 7f4230f18adcd6f0d80328a57cf57246655c4c72 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:03:07 -0800 Subject: [PATCH 2/7] Add a warning banner to the legacy inspector --- .../inspector/inspector_screen_body.dart | 6 ++-- .../inspector_settings_dialog.dart | 26 ++++++++++++++- .../src/shared/managers/banner_messages.dart | 32 +++++++++++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart index 6d711773136..5ab577d564d 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart @@ -16,11 +16,11 @@ import '../../shared/analytics/constants.dart' as gac; import '../../shared/analytics/metrics.dart'; import '../../shared/console/eval/inspector_tree.dart'; import '../../shared/globals.dart'; +import '../../shared/managers/banner_messages.dart'; import '../../shared/managers/error_badge_manager.dart'; import '../../shared/primitives/blocking_action_mixin.dart'; import '../../shared/ui/common_widgets.dart'; import '../../shared/ui/search.dart'; -import '../../shared/utils/utils.dart'; import '../inspector_shared/inspector_controls.dart'; import '../inspector_shared/inspector_screen.dart'; import '../inspector_shared/inspector_settings_dialog.dart'; @@ -113,7 +113,7 @@ class InspectorScreenBodyState extends State _summaryTreeController.setSearchTarget(searchTarget); - safeUnawaited(_showLegacyInspectorWarning(context)); + _showLegacyInspectorWarning(context); } @override @@ -221,7 +221,7 @@ class InspectorScreenBodyState extends State _summaryTreeController.resetSearch(); } - void _showLegacyInspectorWarning(BuildContext context) { + void _showLegacyInspectorWarning(BuildContext context) { if (context.mounted) { pushLegacyInspectorWarning(InspectorScreen.id); } diff --git a/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart b/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart index ebc37053d03..5fd78a4f222 100644 --- a/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart +++ b/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:devtools_app_shared/ui.dart'; +import 'package:devtools_app_shared/utils.dart'; import 'package:flutter/material.dart'; import 'package:vm_service/vm_service.dart' hide Stack; @@ -12,14 +13,37 @@ import '../../shared/analytics/analytics.dart' as ga; import '../../shared/analytics/constants.dart' as gac; import '../../shared/feature_flags.dart'; import '../../shared/globals.dart'; +import '../../shared/managers/banner_messages.dart'; import '../../shared/preferences/preferences.dart'; import '../../shared/primitives/simple_items.dart'; import '../../shared/ui/common_widgets.dart'; import '../../shared/ui/editable_list.dart'; +import 'inspector_screen.dart'; -class FlutterInspectorSettingsDialog extends StatelessWidget { +class FlutterInspectorSettingsDialog extends StatefulWidget { const FlutterInspectorSettingsDialog({super.key}); + @override + State createState() => + _FlutterInspectorSettingsDialogState(); +} + +class _FlutterInspectorSettingsDialogState + extends State + with AutoDisposeMixin { + @override + void initState() { + super.initState(); + addAutoDisposeListener(preferences.inspector.legacyInspectorEnabled, () { + if (!preferences.inspector.legacyInspectorEnabled.value) { + bannerMessages.removeMessageByKey( + LegacyInspectorWarningMessage.buildKey(InspectorScreen.id), + InspectorScreen.id, + ); + } + }); + } + @override Widget build(BuildContext context) { final theme = Theme.of(context); diff --git a/packages/devtools_app/lib/src/shared/managers/banner_messages.dart b/packages/devtools_app/lib/src/shared/managers/banner_messages.dart index 1597cf5cd8c..536dc11c2ef 100644 --- a/packages/devtools_app/lib/src/shared/managers/banner_messages.dart +++ b/packages/devtools_app/lib/src/shared/managers/banner_messages.dart @@ -521,6 +521,34 @@ The $codeType DevTools debugger is in maintenance mode. For the best debugging e ); } +class LegacyInspectorWarningMessage extends BannerWarning { + LegacyInspectorWarningMessage({required super.screenId}) + : super( + key: buildKey(screenId), + buildTextSpans: (context) => [ + const TextSpan( + text: + 'The legacy inspector will be removed in a future release. ' + 'Please enable the new inspector in the inspector settings. ' + 'If there is an issue preventing you from using the new ' + 'inspector, please file a ', + ), + GaLinkTextSpan( + link: const GaLink( + display: 'bug', + url: 'https://github.com/flutter/devtools/issues/new', + ), + context: context, + style: Theme.of(context).linkTextStyle, + ), + const TextSpan(text: '.'), + ], + ); + + static Key buildKey(String screenId) => + Key('LegacyInspectorWarningMessage - $screenId'); +} + void maybePushDebugModePerformanceMessage(String screenId) { if (offlineDataController.showingOfflineData.value) return; if (serviceConnection.serviceManager.connectedApp?.isDebugFlutterAppNow ?? @@ -549,6 +577,10 @@ void pushDebuggerIdeRecommendationMessage(String screenId) { ); } +void pushLegacyInspectorWarning(String screenId) { + bannerMessages.addMessage(LegacyInspectorWarningMessage(screenId: screenId)); +} + extension BannerMessageThemeExtension on ThemeData { TextStyle get warningMessageLinkStyle => regularTextStyle.copyWith( decoration: TextDecoration.underline, From 39bff168a7a07347d27a8ca5242276ba86efa407 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 11 Dec 2025 09:13:29 -0800 Subject: [PATCH 3/7] Fix test (still need to fix goldens --- .../test/screens/inspector_v2/inspector_integration_test.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/devtools_app/test/screens/inspector_v2/inspector_integration_test.dart b/packages/devtools_app/test/screens/inspector_v2/inspector_integration_test.dart index 6d4e0cbfb3e..c9f902fdb60 100644 --- a/packages/devtools_app/test/screens/inspector_v2/inspector_integration_test.dart +++ b/packages/devtools_app/test/screens/inspector_v2/inspector_integration_test.dart @@ -18,6 +18,7 @@ import 'package:devtools_app/src/screens/inspector_v2/inspector_tree_controller. import 'package:devtools_app/src/screens/inspector_v2/layout_explorer/ui/utils.dart'; import 'package:devtools_app/src/screens/inspector_v2/widget_properties/properties_view.dart'; import 'package:devtools_app_shared/ui.dart'; +import 'package:devtools_app_shared/utils.dart'; import 'package:devtools_test/helpers.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -64,6 +65,7 @@ void main() { await env.setupEnvironment(); // Enable the V2 inspector: preferences.inspector.setLegacyInspectorEnabled(false); + setGlobal(BannerMessagesController, BannerMessagesController()); }); tearDown(() async { From 00518bd664456fa702f27dc67260356290c0ddb8 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 11 Dec 2025 10:38:24 -0800 Subject: [PATCH 4/7] Update settings wording --- .../src/screens/inspector_shared/inspector_settings_dialog.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart b/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart index 5fd78a4f222..823a3dd3c6a 100644 --- a/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart +++ b/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart @@ -98,7 +98,7 @@ class _FlutterInspectorSettingsDialogState title: 'Use legacy inspector', description: 'Disable the redesigned Flutter inspector. Please know that ' - 'the legacy inspector may be removed in a future release.', + 'the legacy inspector will be removed in a future release.', gaItem: gac.inspectorV2Disabled, ), ), From 05b2fbfced47219459475399fdb0e98bdd07f388 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 11 Dec 2025 10:39:54 -0800 Subject: [PATCH 5/7] Update release notes --- packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md index 9831e18f96e..c691a0484f2 100644 --- a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md +++ b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md @@ -19,7 +19,8 @@ TODO: Remove this section if there are not any general updates. ## Inspector updates -TODO: Remove this section if there are not any general updates. +- Added a warning banner that the legacy inspector will be removed in a future + release. - [#9572](https://github.com/flutter/devtools/pull/9572) ## Performance updates From 846f052f3c760f65d6445054499fb066a02af77c Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 11 Dec 2025 11:07:09 -0800 Subject: [PATCH 6/7] Fix legacy inspector tests too --- .../test/screens/inspector/inspector_integration_test.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart b/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart index 013ec0747a6..fe52c93ba72 100644 --- a/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart +++ b/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. import 'package:devtools_app/devtools_app.dart'; +import 'package:devtools_app_shared/utils.dart'; import 'package:devtools_test/helpers.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -37,6 +38,10 @@ void main() { } } + setUp(() { + setGlobal(BannerMessagesController, BannerMessagesController()); + }); + group('screenshot tests', () { setUpAll(() { env = FlutterTestEnvironment( From 632469649dd2480e409a70f73144e61f03a1f4f5 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 11 Dec 2025 12:37:20 -0800 Subject: [PATCH 7/7] Fix more test failures --- .../screens/inspector/inspector_integration_test.dart | 11 ++++------- .../test/screens/inspector/inspector_screen_test.dart | 1 + 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart b/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart index fe52c93ba72..659959add0c 100644 --- a/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart +++ b/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart @@ -38,8 +38,11 @@ void main() { } } - setUp(() { + setUp(() async { + await env.setupEnvironment(); setGlobal(BannerMessagesController, BannerMessagesController()); + // Ensure the legacy inspector is enabled: + preferences.inspector.setLegacyInspectorEnabled(true); }); group('screenshot tests', () { @@ -50,12 +53,6 @@ void main() { env.afterEverySetup = resetInspectorSelection; }); - setUp(() async { - await env.setupEnvironment(); - // Ensure the legacy inspector is enabled: - preferences.inspector.setLegacyInspectorEnabled(true); - }); - tearDownAll(() async { await env.tearDownEnvironment(force: true); }); diff --git a/packages/devtools_app/test/screens/inspector/inspector_screen_test.dart b/packages/devtools_app/test/screens/inspector/inspector_screen_test.dart index 7dbc36f50f1..0a09554f33e 100644 --- a/packages/devtools_app/test/screens/inspector/inspector_screen_test.dart +++ b/packages/devtools_app/test/screens/inspector/inspector_screen_test.dart @@ -57,6 +57,7 @@ void main() { setGlobal(PreferencesController, PreferencesController()); setGlobal(Storage, FlutterTestStorage()); setGlobal(NotificationService, NotificationService()); + setGlobal(BannerMessagesController, BannerMessagesController()); fakeServiceConnection.consoleService.ensureServiceInitialized(); // Enable the legacy inspector: preferences.inspector.setLegacyInspectorEnabled(true);