From 523b0c4d8426c6ba0f3aab28b8531e9fbf15d9f4 Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Mon, 26 Feb 2024 15:55:52 -0800 Subject: [PATCH] Move debugShowWidgetInspectorOverride (#144029) Contributes to https://github.com/dart-lang/leak_tracker/issues/218 --- packages/flutter/lib/src/widgets/app.dart | 21 +------------ packages/flutter/lib/src/widgets/binding.dart | 30 +++++++++++++++++++ .../lib/src/widgets/service_extensions.dart | 4 +-- .../lib/src/widgets/widget_inspector.dart | 7 ++--- .../test/painting/system_fonts_test.dart | 7 +++-- .../test/widgets/widget_inspector_test.dart | 6 ++-- packages/flutter_test/lib/src/binding.dart | 2 ++ 7 files changed, 46 insertions(+), 31 deletions(-) diff --git a/packages/flutter/lib/src/widgets/app.dart b/packages/flutter/lib/src/widgets/app.dart index db31a2654a0..9c85c1be292 100644 --- a/packages/flutter/lib/src/widgets/app.dart +++ b/packages/flutter/lib/src/widgets/app.dart @@ -1193,25 +1193,6 @@ class WidgetsApp extends StatefulWidget { /// Used by the `showPerformanceOverlay` VM service extension. static bool showPerformanceOverlayOverride = false; - /// If true, forces the widget inspector to be visible. - /// - /// 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. - static bool get debugShowWidgetInspectorOverride { - return _debugShowWidgetInspectorOverrideNotifier.value; - } - static set debugShowWidgetInspectorOverride(bool value) { - _debugShowWidgetInspectorOverrideNotifier.value = value; - } - - static final ValueNotifier _debugShowWidgetInspectorOverrideNotifier = ValueNotifier(false); - /// If false, prevents the debug banner from being visible. /// /// Used by the `debugAllowBanner` VM service extension. @@ -1760,7 +1741,7 @@ class _WidgetsAppState extends State with WidgetsBindingObserver { assert(() { result = ValueListenableBuilder( - valueListenable: WidgetsApp._debugShowWidgetInspectorOverrideNotifier, + valueListenable: WidgetsBinding.instance.debugShowWidgetInspectorOverrideNotifier, builder: (BuildContext context, bool debugShowWidgetInspectorOverride, Widget? child) { if (widget.debugShowWidgetInspector || debugShowWidgetInspectorOverride) { return WidgetInspector( diff --git a/packages/flutter/lib/src/widgets/binding.dart b/packages/flutter/lib/src/widgets/binding.dart index c2088cea377..17c3310c131 100644 --- a/packages/flutter/lib/src/widgets/binding.dart +++ b/packages/flutter/lib/src/widgets/binding.dart @@ -375,6 +375,36 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB static WidgetsBinding get instance => BindingBase.checkInstance(_instance); static WidgetsBinding? _instance; + /// If true, forces the widget inspector to be visible. + /// + /// 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. + bool get debugShowWidgetInspectorOverride { + return debugShowWidgetInspectorOverrideNotifier.value; + } + set debugShowWidgetInspectorOverride(bool value) { + debugShowWidgetInspectorOverrideNotifier.value = value; + } + + /// Notifier for [debugShowWidgetInspectorOverride]. + ValueNotifier get debugShowWidgetInspectorOverrideNotifier => _debugShowWidgetInspectorOverrideNotifierObject ??= ValueNotifier(false); + ValueNotifier? _debugShowWidgetInspectorOverrideNotifierObject; + + @visibleForTesting + @override + void resetInternalState() { + // ignore: invalid_use_of_visible_for_testing_member, https://github.com/dart-lang/sdk/issues/41998 + super.resetInternalState(); + _debugShowWidgetInspectorOverrideNotifierObject?.dispose(); + _debugShowWidgetInspectorOverrideNotifierObject = null; + } + void _debugAddStackFilters() { const PartialStackFrame elementInflateWidget = PartialStackFrame(package: 'package:flutter/src/widgets/framework.dart', className: 'Element', method: 'inflateWidget'); const PartialStackFrame elementUpdateChild = PartialStackFrame(package: 'package:flutter/src/widgets/framework.dart', className: 'Element', method: 'updateChild'); diff --git a/packages/flutter/lib/src/widgets/service_extensions.dart b/packages/flutter/lib/src/widgets/service_extensions.dart index cb0e165c1aa..caeb190758a 100644 --- a/packages/flutter/lib/src/widgets/service_extensions.dart +++ b/packages/flutter/lib/src/widgets/service_extensions.dart @@ -123,11 +123,11 @@ enum WidgetInspectorServiceExtensions { structuredErrors, /// Name of service extension that, when called, will change the value of - /// [WidgetsApp.debugShowWidgetInspectorOverride], which controls whether the + /// [WidgetsBinding.debugShowWidgetInspectorOverride], which controls whether the /// on-device widget inspector is visible. /// /// See also: - /// * [WidgetsApp.debugShowWidgetInspectorOverride], which is the flag that + /// * [WidgetsBinding.debugShowWidgetInspectorOverride], which is the flag that /// this service extension exposes. /// * [WidgetInspectorService.initServiceExtensions], where the service /// extension is registered. diff --git a/packages/flutter/lib/src/widgets/widget_inspector.dart b/packages/flutter/lib/src/widgets/widget_inspector.dart index c2322d0b3a3..d578e594cb8 100644 --- a/packages/flutter/lib/src/widgets/widget_inspector.dart +++ b/packages/flutter/lib/src/widgets/widget_inspector.dart @@ -25,7 +25,6 @@ import 'package:flutter/rendering.dart'; import 'package:flutter/scheduler.dart'; import 'package:meta/meta_meta.dart'; -import 'app.dart'; import 'basic.dart'; import 'binding.dart'; import 'debug.dart'; @@ -1084,10 +1083,10 @@ mixin WidgetInspectorService { _registerBoolServiceExtension( name: WidgetInspectorServiceExtensions.show.name, - getter: () async => WidgetsApp.debugShowWidgetInspectorOverride, + getter: () async => WidgetsBinding.instance.debugShowWidgetInspectorOverride, setter: (bool value) { - if (WidgetsApp.debugShowWidgetInspectorOverride != value) { - WidgetsApp.debugShowWidgetInspectorOverride = value; + if (WidgetsBinding.instance.debugShowWidgetInspectorOverride != value) { + WidgetsBinding.instance.debugShowWidgetInspectorOverride = value; } return Future.value(); }, diff --git a/packages/flutter/test/painting/system_fonts_test.dart b/packages/flutter/test/painting/system_fonts_test.dart index 3aa495a86fd..a0b45374cc7 100644 --- a/packages/flutter/test/painting/system_fonts_test.dart +++ b/packages/flutter/test/painting/system_fonts_test.dart @@ -37,9 +37,12 @@ Future verifyMarkedNeedsLayoutDuringTransientCallbacksPhase(WidgetTester t } void main() { - testWidgets('RenderParagraph relayout upon system fonts changes', // TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean] - experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), + LeakTesting.settings = LeakTesting.settings.withIgnored(classes: ['CurvedAnimation']); + + testWidgets('RenderParagraph relayout upon system fonts changes', + // TODO(polina-c): dispose _NotAnnounced, https://github.com/dart-lang/leak_tracker/issues/218 [leaks-to-clean] + experimentalLeakTesting: LeakTesting.settings.withIgnored(classes: ['ValueNotifier', '_NotAnnounced']), (WidgetTester tester) async { await tester.pumpWidget( const MaterialApp( diff --git a/packages/flutter/test/widgets/widget_inspector_test.dart b/packages/flutter/test/widgets/widget_inspector_test.dart index d6933efe101..5b9e3bb9b0d 100644 --- a/packages/flutter/test/widgets/widget_inspector_test.dart +++ b/packages/flutter/test/widgets/widget_inspector_test.dart @@ -4130,7 +4130,7 @@ class _TestWidgetInspectorService extends TestWidgetInspectorService { debugShowChangeCounter++; } - WidgetsApp.debugShowWidgetInspectorOverride = false; + WidgetsBinding.instance.debugShowWidgetInspectorOverride = false; valueListenableBuilderWidget.valueListenable.addListener(debugShowWidgetInspectorOverrideCallback); service.rebuildCount = 0; @@ -4155,7 +4155,7 @@ class _TestWidgetInspectorService extends TestWidgetInspectorService { ), equals('true'), ); - expect(WidgetsApp.debugShowWidgetInspectorOverride, isTrue); + expect(WidgetsBinding.instance.debugShowWidgetInspectorOverride, isTrue); expect(extensionChangedEvents.length, equals(1)); expect(service.rebuildCount, equals(0)); // Should not be force rebuilt. expect(debugShowChangeCounter, equals(1)); @@ -4195,7 +4195,7 @@ class _TestWidgetInspectorService extends TestWidgetInspectorService { expect(extensionChangedEvents.length, equals(3)); expect(service.rebuildCount, equals(0)); // Should not be force rebuilt. expect(debugShowChangeCounter, equals(2)); - expect(WidgetsApp.debugShowWidgetInspectorOverride, isFalse); + expect(WidgetsBinding.instance.debugShowWidgetInspectorOverride, isFalse); }); testWidgets('ext.flutter.inspector.screenshot', (WidgetTester tester) async { diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart index b9c68addffa..6a0824163e2 100644 --- a/packages/flutter_test/lib/src/binding.dart +++ b/packages/flutter_test/lib/src/binding.dart @@ -1174,6 +1174,8 @@ abstract class TestWidgetsFlutterBinding extends BindingBase keyEventManager.clearState(); // ignore: invalid_use_of_visible_for_testing_member RendererBinding.instance.initMouseTracker(); + + assert(ServicesBinding.instance == WidgetsBinding.instance); // ignore: invalid_use_of_visible_for_testing_member ServicesBinding.instance.resetInternalState(); }