diff --git a/packages/flutter/lib/src/foundation/binding.dart b/packages/flutter/lib/src/foundation/binding.dart index e6c650e77eb..e140e8774aa 100644 --- a/packages/flutter/lib/src/foundation/binding.dart +++ b/packages/flutter/lib/src/foundation/binding.dart @@ -236,12 +236,12 @@ abstract class BindingBase { } _postExtensionStateChangedEvent( brightnessOverrideExtensionName, - (debugBrightnessOverride ?? platformDispatcher.platformBrightness).toString(), + (debugBrightnessOverride ?? window.platformBrightness).toString(), ); await reassembleApplication(); } return { - 'value': (debugBrightnessOverride ?? platformDispatcher.platformBrightness).toString(), + 'value': (debugBrightnessOverride ?? window.platformBrightness).toString(), }; }, ); diff --git a/packages/flutter/lib/src/gestures/binding.dart b/packages/flutter/lib/src/gestures/binding.dart index 8b42ad053dc..7aa5f08f6dd 100644 --- a/packages/flutter/lib/src/gestures/binding.dart +++ b/packages/flutter/lib/src/gestures/binding.dart @@ -198,7 +198,7 @@ mixin GestureBinding on BindingBase implements HitTestable, HitTestDispatcher, H void initInstances() { super.initInstances(); _instance = this; - platformDispatcher.onPointerDataPacket = _handlePointerDataPacket; + window.onPointerDataPacket = _handlePointerDataPacket; } @override diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart index 77d86dbc6b6..e83bf5de756 100644 --- a/packages/flutter/lib/src/rendering/binding.dart +++ b/packages/flutter/lib/src/rendering/binding.dart @@ -33,7 +33,7 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture onSemanticsOwnerCreated: _handleSemanticsOwnerCreated, onSemanticsOwnerDisposed: _handleSemanticsOwnerDisposed, ); - platformDispatcher + window ..onMetricsChanged = handleMetricsChanged ..onTextScaleFactorChanged = handleTextScaleFactorChanged ..onPlatformBrightnessChanged = handlePlatformBrightnessChanged @@ -280,7 +280,7 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture } void _handleSemanticsEnabledChanged() { - setSemanticsEnabled(platformDispatcher.semanticsEnabled); + setSemanticsEnabled(window.semanticsEnabled); } /// Whether the render tree associated with this binding should produce a tree diff --git a/packages/flutter/lib/src/scheduler/binding.dart b/packages/flutter/lib/src/scheduler/binding.dart index a57ac34dadf..0fe1ecaf163 100644 --- a/packages/flutter/lib/src/scheduler/binding.dart +++ b/packages/flutter/lib/src/scheduler/binding.dart @@ -265,10 +265,10 @@ mixin SchedulerBinding on BindingBase { void addTimingsCallback(TimingsCallback callback) { _timingsCallbacks.add(callback); if (_timingsCallbacks.length == 1) { - assert(platformDispatcher.onReportTimings == null); - platformDispatcher.onReportTimings = _executeTimingsCallbacks; + assert(window.onReportTimings == null); + window.onReportTimings = _executeTimingsCallbacks; } - assert(platformDispatcher.onReportTimings == _executeTimingsCallbacks); + assert(window.onReportTimings == _executeTimingsCallbacks); } /// Removes a callback that was earlier added by [addTimingsCallback]. @@ -276,7 +276,7 @@ mixin SchedulerBinding on BindingBase { assert(_timingsCallbacks.contains(callback)); _timingsCallbacks.remove(callback); if (_timingsCallbacks.isEmpty) { - platformDispatcher.onReportTimings = null; + window.onReportTimings = null; } } @@ -724,8 +724,8 @@ mixin SchedulerBinding on BindingBase { /// [PlatformDispatcher.onDrawFrame] are registered. @protected void ensureFrameCallbacksRegistered() { - platformDispatcher.onBeginFrame ??= _handleBeginFrame; - platformDispatcher.onDrawFrame ??= _handleDrawFrame; + window.onBeginFrame ??= _handleBeginFrame; + window.onDrawFrame ??= _handleDrawFrame; } /// Schedules a new frame using [scheduleFrame] if this object is not @@ -790,7 +790,7 @@ mixin SchedulerBinding on BindingBase { return true; }()); ensureFrameCallbacksRegistered(); - platformDispatcher.scheduleFrame(); + window.scheduleFrame(); _hasScheduledFrame = true; } @@ -827,7 +827,7 @@ mixin SchedulerBinding on BindingBase { debugPrintStack(label: 'scheduleForcedFrame() called. Current phase is $schedulerPhase.'); return true; }()); - platformDispatcher.scheduleFrame(); + window.scheduleFrame(); _hasScheduledFrame = true; } diff --git a/packages/flutter/lib/src/semantics/binding.dart b/packages/flutter/lib/src/semantics/binding.dart index 62f9b82b062..131ff786d03 100644 --- a/packages/flutter/lib/src/semantics/binding.dart +++ b/packages/flutter/lib/src/semantics/binding.dart @@ -21,7 +21,7 @@ mixin SemanticsBinding on BindingBase { void initInstances() { super.initInstances(); _instance = this; - _accessibilityFeatures = platformDispatcher.accessibilityFeatures; + _accessibilityFeatures = window.accessibilityFeatures; } /// Called when the platform accessibility features change. @@ -29,7 +29,7 @@ mixin SemanticsBinding on BindingBase { /// See [dart:ui.PlatformDispatcher.onAccessibilityFeaturesChanged]. @protected void handleAccessibilityFeaturesChanged() { - _accessibilityFeatures = platformDispatcher.accessibilityFeatures; + _accessibilityFeatures = window.accessibilityFeatures; } /// Creates an empty semantics update builder. diff --git a/packages/flutter/lib/src/semantics/semantics.dart b/packages/flutter/lib/src/semantics/semantics.dart index d30d1d7e874..f5fd3abbefa 100644 --- a/packages/flutter/lib/src/semantics/semantics.dart +++ b/packages/flutter/lib/src/semantics/semantics.dart @@ -2658,7 +2658,7 @@ class SemanticsOwner extends ChangeNotifier { final CustomSemanticsAction action = CustomSemanticsAction.getAction(actionId)!; builder.updateCustomAction(id: actionId, label: action.label, hint: action.hint, overrideId: action.action?.index ?? -1); } - SemanticsBinding.instance!.platformDispatcher.updateSemantics(builder.build()); + SemanticsBinding.instance!.window.updateSemantics(builder.build()); notifyListeners(); } diff --git a/packages/flutter/lib/src/services/binding.dart b/packages/flutter/lib/src/services/binding.dart index b4fa2c8e6c5..8992ba60e21 100644 --- a/packages/flutter/lib/src/services/binding.dart +++ b/packages/flutter/lib/src/services/binding.dart @@ -28,7 +28,7 @@ mixin ServicesBinding on BindingBase, SchedulerBinding { _instance = this; _defaultBinaryMessenger = createBinaryMessenger(); _restorationManager = createRestorationManager(); - platformDispatcher.onPlatformMessage = defaultBinaryMessenger.handlePlatformMessage; + window.onPlatformMessage = defaultBinaryMessenger.handlePlatformMessage; initLicenses(); SystemChannels.system.setMessageHandler((dynamic message) => handleSystemMessage(message as Object)); SystemChannels.lifecycle.setMessageHandler(_handleLifecycleMessage); diff --git a/packages/flutter/lib/src/widgets/app.dart b/packages/flutter/lib/src/widgets/app.dart index 1a14c9c56d7..2b4d801febe 100644 --- a/packages/flutter/lib/src/widgets/app.dart +++ b/packages/flutter/lib/src/widgets/app.dart @@ -1113,15 +1113,15 @@ class _WidgetsAppState extends State with WidgetsBindingObserver { // If window.defaultRouteName isn't '/', we should assume it was set // intentionally via `setInitialRoute`, and should override whatever is in // [widget.initialRoute]. - String get _initialRouteName => WidgetsBinding.instance!.platformDispatcher.defaultRouteName != Navigator.defaultRouteName - ? WidgetsBinding.instance!.platformDispatcher.defaultRouteName - : widget.initialRoute ?? WidgetsBinding.instance!.platformDispatcher.defaultRouteName; + String get _initialRouteName => WidgetsBinding.instance!.window.defaultRouteName != Navigator.defaultRouteName + ? WidgetsBinding.instance!.window.defaultRouteName + : widget.initialRoute ?? WidgetsBinding.instance!.window.defaultRouteName; @override void initState() { super.initState(); _updateRouting(); - _locale = _resolveLocales(WidgetsBinding.instance!.platformDispatcher.locales, widget.supportedLocales); + _locale = _resolveLocales(WidgetsBinding.instance!.window.locales, widget.supportedLocales); WidgetsBinding.instance!.addObserver(this); } diff --git a/packages/flutter/lib/src/widgets/binding.dart b/packages/flutter/lib/src/widgets/binding.dart index 22c4e085f7f..c8a6cfd54e9 100644 --- a/packages/flutter/lib/src/widgets/binding.dart +++ b/packages/flutter/lib/src/widgets/binding.dart @@ -245,7 +245,7 @@ abstract class WidgetsBindingObserver { /// /// This method exposes notifications from /// [dart:ui.PlatformDispatcher.onLocaleChanged]. - void didChangeLocales(List? locale) { } + void didChangeLocales(List? locales) { } /// Called when the system puts the app in the background or returns /// the app to the foreground. @@ -287,8 +287,8 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB // properly setup the [defaultBinaryMessenger] instance. _buildOwner = BuildOwner(); buildOwner!.onBuildScheduled = _handleBuildScheduled; - platformDispatcher.onLocaleChanged = handleLocaleChanged; - platformDispatcher.onAccessibilityFeaturesChanged = handleAccessibilityFeaturesChanged; + window.onLocaleChanged = handleLocaleChanged; + window.onAccessibilityFeaturesChanged = handleAccessibilityFeaturesChanged; SystemChannels.navigation.setMethodCallHandler(_handleNavigationInvocation); FlutterErrorDetails.propertiesTransformers.add(transformDebugCreator); } @@ -586,7 +586,7 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB @protected @mustCallSuper void handleLocaleChanged() { - dispatchLocalesChanged(platformDispatcher.locales); + dispatchLocalesChanged(window.locales); } /// Notify all the observers that the locale has changed (using @@ -1016,7 +1016,7 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB /// method again with the matched locale of the first call omitted from /// `supportedLocales`. Locale? computePlatformResolvedLocale(List supportedLocales) { - return platformDispatcher.computePlatformResolvedLocale(supportedLocales); + return window.computePlatformResolvedLocale(supportedLocales); } } diff --git a/packages/flutter/test/widgets/binding_first_frame_rasterized_test.dart b/packages/flutter/test/widgets/binding_first_frame_rasterized_test.dart index 45eda8f889a..cb179de46f1 100644 --- a/packages/flutter/test/widgets/binding_first_frame_rasterized_test.dart +++ b/packages/flutter/test/widgets/binding_first_frame_rasterized_test.dart @@ -19,14 +19,14 @@ void main() { // Simulates the engine completing a frame render to trigger the // appropriate callback setting [WidgetBinding.firstFrameRasterized]. - binding.platformDispatcher.onReportTimings!([]); + binding.window.onReportTimings!([]); expect(binding.firstFrameRasterized, isFalse); binding.allowFirstFrame(); fakeAsync.flushTimers(); // Simulates the engine again. - binding.platformDispatcher.onReportTimings!([]); + binding.window.onReportTimings!([]); expect(binding.firstFrameRasterized, isTrue); }); }); diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart index d1714f07dc6..dce1080ccd7 100644 --- a/packages/flutter_test/lib/src/binding.dart +++ b/packages/flutter_test/lib/src/binding.dart @@ -1039,8 +1039,8 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding { @override void ensureFrameCallbacksRegistered() { // Leave PlatformDispatcher alone, do nothing. - assert(platformDispatcher.onDrawFrame == null); - assert(platformDispatcher.onBeginFrame == null); + assert(window.onDrawFrame == null); + assert(window.onBeginFrame == null); } @override diff --git a/packages/flutter_test/test/window_test.dart b/packages/flutter_test/test/window_test.dart index bfde8d88b7c..0c9d03728b3 100644 --- a/packages/flutter_test/test/window_test.dart +++ b/packages/flutter_test/test/window_test.dart @@ -5,7 +5,7 @@ import 'dart:ui' as ui show window; import 'dart:ui' show Size, Locale, WindowPadding, AccessibilityFeatures, Brightness; -import 'package:flutter/widgets.dart' show WidgetsBinding; +import 'package:flutter/widgets.dart' show WidgetsBinding, WidgetsBindingObserver; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -184,6 +184,14 @@ void main() { expect(WidgetsBinding.instance!.window.devicePixelRatio, originalDevicePixelRatio); expect(WidgetsBinding.instance!.window.textScaleFactor, originalTextScaleFactor); }); + + testWidgets('TestWindow sends fake locales when WidgetsBindingObserver notifiers are called', (WidgetTester tester) async { + final TestObserver observer = TestObserver(); + retrieveTestBinding(tester).addObserver(observer); + final List expectedValue = [const Locale('fake_language_code')]; + retrieveTestBinding(tester).window.localesTestValue = expectedValue; + expect(observer.locales, equals(expectedValue)); + }); } void verifyThatTestWindowCanFakeProperty({ @@ -273,3 +281,13 @@ class FakeAccessibilityFeatures implements AccessibilityFeatures { return null; } } + +class TestObserver with WidgetsBindingObserver { + List? locales; + Locale? locale; + + @override + void didChangeLocales(List? locales) { + this.locales = locales; + } +}