diff --git a/packages/flutter/lib/src/widgets/app.dart b/packages/flutter/lib/src/widgets/app.dart index 9c85c1be292..bea2378a292 100644 --- a/packages/flutter/lib/src/widgets/app.dart +++ b/packages/flutter/lib/src/widgets/app.dart @@ -1193,6 +1193,36 @@ class WidgetsApp extends StatefulWidget { /// Used by the `showPerformanceOverlay` VM service extension. static bool showPerformanceOverlayOverride = false; + /// If true, forces the widget inspector to be visible. + /// + /// Deprecated. + /// Use WidgetsBinding.instance.debugShowWidgetInspectorOverrideNotifier.value + /// instead. + /// + /// Overrides the `debugShowWidgetInspector` value set in [WidgetsApp]. + /// + /// Used by the `debugShowWidgetInspector` debugging extension. + /// + /// The inspector allows the selection of a location on your device or emulator + /// and view what widgets and render objects associated with it. An outline of + /// the selected widget and some summary information is shown on device and + /// more detailed information is shown in the IDE or DevTools. + @Deprecated( + 'Use WidgetsBinding.instance.debugShowWidgetInspectorOverrideNotifier.value instead. ' + 'This feature was deprecated after v3.20.0-14.0.pre.', + ) + static bool get debugShowWidgetInspectorOverride { + return WidgetsBinding.instance.debugShowWidgetInspectorOverrideNotifier.value; + } + + @Deprecated( + 'Use WidgetsBinding.instance.debugShowWidgetInspectorOverrideNotifier.value instead. ' + 'This feature was deprecated after v3.20.0-14.0.pre.', + ) + static set debugShowWidgetInspectorOverride(bool value) { + WidgetsBinding.instance.debugShowWidgetInspectorOverrideNotifier.value = value; + } + /// If false, prevents the debug banner from being visible. /// /// Used by the `debugAllowBanner` VM service extension. diff --git a/packages/flutter/test/widgets/widget_inspector_test.dart b/packages/flutter/test/widgets/widget_inspector_test.dart index 5b9e3bb9b0d..b40f8ed905e 100644 --- a/packages/flutter/test/widgets/widget_inspector_test.dart +++ b/packages/flutter/test/widgets/widget_inspector_test.dart @@ -4198,6 +4198,97 @@ class _TestWidgetInspectorService extends TestWidgetInspectorService { expect(WidgetsBinding.instance.debugShowWidgetInspectorOverride, isFalse); }); + testWidgets('ext.flutter.inspector.show via WidgetsApp.debugShowWidgetInspectorOverride', (WidgetTester tester) async { + final Iterable> extensionChangedEvents = service.getServiceExtensionStateChangedEvents('ext.flutter.inspector.show'); + Map extensionChangedEvent; + int debugShowChangeCounter = 0; + + final GlobalKey key = GlobalKey(); + await tester.pumpWidget( + WidgetsApp( + key: key, + builder: (BuildContext context, Widget? child) { + return const Placeholder(); + }, + color: const Color(0xFF123456), + ), + ); + + final ValueListenableBuilder valueListenableBuilderWidget = tester.widget( + find.byType(ValueListenableBuilder), + ); + void debugShowWidgetInspectorOverrideCallback() { + debugShowChangeCounter++; + } + + WidgetsApp.debugShowWidgetInspectorOverride = false; + valueListenableBuilderWidget.valueListenable.addListener(debugShowWidgetInspectorOverrideCallback); + + service.rebuildCount = 0; + expect(extensionChangedEvents, isEmpty); + expect( + await service.testBoolExtension( + WidgetInspectorServiceExtensions.show.name, + {'enabled': 'true'}, + ), + equals('true'), + ); + expect(extensionChangedEvents.length, equals(1)); + extensionChangedEvent = extensionChangedEvents.last; + expect(extensionChangedEvent['extension'], equals('ext.flutter.inspector.show')); + expect(extensionChangedEvent['value'], isTrue); + expect(service.rebuildCount, equals(0)); // Should not be force rebuilt. + expect(debugShowChangeCounter, equals(1)); + expect( + await service.testBoolExtension( + WidgetInspectorServiceExtensions.show.name, + {}, + ), + equals('true'), + ); + expect(WidgetsApp.debugShowWidgetInspectorOverride, isTrue); + expect(extensionChangedEvents.length, equals(1)); + expect(service.rebuildCount, equals(0)); // Should not be force rebuilt. + expect(debugShowChangeCounter, equals(1)); + expect( + await service.testBoolExtension( + WidgetInspectorServiceExtensions.show.name, + {'enabled': 'true'}, + ), + equals('true'), + ); + expect(extensionChangedEvents.length, equals(2)); + extensionChangedEvent = extensionChangedEvents.last; + expect(extensionChangedEvent['extension'], equals('ext.flutter.inspector.show')); + expect(extensionChangedEvent['value'], isTrue); + expect(service.rebuildCount, equals(0)); // Should not be force rebuilt. + expect(debugShowChangeCounter, equals(1)); + expect( + await service.testBoolExtension( + WidgetInspectorServiceExtensions.show.name, + {'enabled': 'false'}, + ), + equals('false'), + ); + expect(extensionChangedEvents.length, equals(3)); + extensionChangedEvent = extensionChangedEvents.last; + expect(extensionChangedEvent['extension'], equals('ext.flutter.inspector.show')); + expect(extensionChangedEvent['value'], isFalse); + expect(service.rebuildCount, equals(0)); // Should not be force rebuilt. + expect(debugShowChangeCounter, equals(2)); + expect( + await service.testBoolExtension( + WidgetInspectorServiceExtensions.show.name, + {}, + ), + equals('false'), + ); + expect(extensionChangedEvents.length, equals(3)); + expect(service.rebuildCount, equals(0)); // Should not be force rebuilt. + expect(debugShowChangeCounter, equals(2)); + expect(WidgetsApp.debugShowWidgetInspectorOverride, isFalse); + }); + testWidgets('ext.flutter.inspector.screenshot', (WidgetTester tester) async { final GlobalKey outerContainerKey = GlobalKey(); final GlobalKey paddingKey = GlobalKey();