Unverified Commit bbc01616 authored by Greg Spencer's avatar Greg Spencer Committed by GitHub

Remove references to `Window`, and switch usages to `PlatformDispatcher` or...

Remove references to `Window`, and switch usages to `PlatformDispatcher` or `SingletonFlutterWindow` (#69617)

* Remove references to dart:ui.Window, and point usages to PlatformDispatcher or SingletonFlutterWindow, as appropriate

* remove new test platform dispatchers

* Amend documentation
parent 3b7718c2
......@@ -217,15 +217,16 @@ abstract class SceneBuilderRecorder extends Recorder {
Profile get profile => _profile;
Profile _profile;
/// Called from [Window.onBeginFrame].
/// Called from [dart:ui.PlatformDispatcher.onBeginFrame].
@mustCallSuper
void onBeginFrame() {}
/// Called on every frame.
///
/// An implementation should exercise the [sceneBuilder] to build a frame.
/// However, it must not call [SceneBuilder.build] or [Window.render].
/// Instead the benchmark harness will call them and time them appropriately.
/// However, it must not call [SceneBuilder.build] or
/// [dart:ui.FlutterView.render]. Instead the benchmark harness will call them
/// and time them appropriately.
void onDrawFrame(SceneBuilder sceneBuilder);
@override
......
......@@ -41,8 +41,9 @@ Future<void> main() async {
await SchedulerBinding.instance.endOfFrame;
// We are waiting for the GPU to rasterize a frame here. This makes this flaky,
// we can rely on a more deterministic such as `Window.onReportTimings` once
// We are waiting for the GPU to rasterize a frame here. This makes this
// flaky, we can rely on a more deterministic source such as
// PlatformDispatcher.onReportTimings once
// https://github.com/flutter/flutter/issues/26154 is addressed.
await Future<void>.delayed(const Duration(milliseconds: 50));
debugPrint('==== MEMORY BENCHMARK ==== READY ====');
......
......@@ -5,7 +5,7 @@
import 'dart:convert' show json;
import 'dart:developer' as developer;
import 'dart:io' show exit;
import 'dart:ui' as ui show Window, window, Brightness;
import 'dart:ui' as ui show SingletonFlutterWindow, Brightness, PlatformDispatcher, window;
// Before adding any more dart:ui imports, please read the README.
import 'package:meta/meta.dart';
......@@ -68,23 +68,57 @@ abstract class BindingBase {
static bool _debugInitialized = false;
static bool _debugServiceExtensionsRegistered = false;
/// The window to which this binding is bound.
///
/// A number of additional bindings are defined as extensions of [BindingBase],
/// e.g., [ServicesBinding], [RendererBinding], and [WidgetsBinding]. Each of
/// these bindings define behaviors that interact with a [ui.Window], e.g.,
/// [ServicesBinding] registers a [ui.Window.onPlatformMessage] handler, and
/// [RendererBinding] registers [ui.Window.onMetricsChanged],
/// [ui.Window.onTextScaleFactorChanged], [ui.Window.onSemanticsEnabledChanged],
/// and [ui.Window.onSemanticsAction] handlers.
///
/// Each of these other bindings could individually access a [Window] statically,
/// but that would preclude the ability to test these behaviors with a fake
/// window for verification purposes. Therefore, [BindingBase] exposes this
/// [Window] for use by other bindings. A subclass of [BindingBase], such as
/// The main window to which this binding is bound.
///
/// A number of additional bindings are defined as extensions of
/// [BindingBase], e.g., [ServicesBinding], [RendererBinding], and
/// [WidgetsBinding]. Each of these bindings define behaviors that interact
/// with a [ui.SingletonFlutterWindow].
///
/// Each of these other bindings could individually access a
/// [ui.SingletonFlutterWindow] statically, but that would preclude the
/// ability to test its behaviors with a fake window for verification
/// purposes. Therefore, [BindingBase] exposes this
/// [ui.SingletonFlutterWindow] for use by other bindings. A subclass of
/// [BindingBase], such as [TestWidgetsFlutterBinding], can override this
/// accessor to return a different [ui.SingletonFlutterWindow] implementation,
/// such as a [TestWindow].
///
/// The `window` is a singleton meant for use by applications that only have a
/// single main window. In addition to the properties of [ui.FlutterWindow],
/// `window` provides access to platform-specific properties and callbacks
/// available on the [platformDispatcher].
///
/// For applications designed for more than one main window, prefer using the
/// [platformDispatcher] to access available views via
/// [ui.PlatformDispatcher.views].
///
/// However, multiple window support is not yet implemented, so currently this
/// provides access to the one and only window.
// TODO(gspencergoog): remove the preceding note once multi-window support is
// active.
ui.SingletonFlutterWindow get window => ui.window;
/// The [ui.PlatformDispatcher] to which this binding is bound.
///
/// A number of additional bindings are defined as extensions of
/// [BindingBase], e.g., [ServicesBinding], [RendererBinding], and
/// [WidgetsBinding]. Each of these bindings define behaviors that interact
/// with a [ui.PlatformDispatcher], e.g., [ServicesBinding] registers a
/// [ui.PlatformDispatcher.onPlatformMessage] handler, and [RendererBinding]
/// registers [ui.PlatformDispatcher.onMetricsChanged],
/// [ui.PlatformDispatcher.onTextScaleFactorChanged],
/// [ui.PlatformDispatcher.onSemanticsEnabledChanged], and
/// [ui.PlatformDispatcher.onSemanticsAction] handlers.
///
/// Each of these other bindings could individually access a
/// [ui.PlatformDispatcher] statically, but that would preclude the ability to
/// test these behaviors with a fake platform dispatcher for verification
/// purposes. Therefore, [BindingBase] exposes this [ui.PlatformDispatcher]
/// for use by other bindings. A subclass of [BindingBase], such as
/// [TestWidgetsFlutterBinding], can override this accessor to return a
/// different [Window] implementation, such as a [TestWindow].
ui.Window get window => ui.window;
/// different [ui.PlatformDispatcher] implementation.
ui.PlatformDispatcher get platformDispatcher => ui.PlatformDispatcher.instance;
/// The initialization method. Subclasses override this method to hook into
/// the platform and otherwise configure their services. Subclasses must call
......@@ -202,12 +236,12 @@ abstract class BindingBase {
}
_postExtensionStateChangedEvent(
brightnessOverrideExtensionName,
(debugBrightnessOverride ?? window.platformBrightness).toString(),
(debugBrightnessOverride ?? platformDispatcher.platformBrightness).toString(),
);
await reassembleApplication();
}
return <String, dynamic>{
'value': (debugBrightnessOverride ?? window.platformBrightness).toString(),
'value': (debugBrightnessOverride ?? platformDispatcher.platformBrightness).toString(),
};
},
);
......
......@@ -102,7 +102,7 @@ String debugFormatDouble(double? value) {
}
/// A setting that can be used to override the platform [Brightness] exposed
/// from [BindingBase.window].
/// from [BindingBase.platformDispatcher].
///
/// See also:
///
......
......@@ -158,7 +158,7 @@ const Duration _samplingInterval = Duration(microseconds: 16667);
/// ### [PointerDownEvent]
///
/// When a [PointerDownEvent] is received by the [GestureBinding] (from
/// [Window.onPointerDataPacket], as interpreted by the
/// [dart:ui.PlatformDispatcher.onPointerDataPacket], as interpreted by the
/// [PointerEventConverter]), a [hitTest] is performed to determine which
/// [HitTestTarget] nodes are affected. (Other bindings are expected to
/// implement [hitTest] to defer to [HitTestable] objects. For example, the
......@@ -198,7 +198,7 @@ mixin GestureBinding on BindingBase implements HitTestable, HitTestDispatcher, H
void initInstances() {
super.initInstances();
_instance = this;
window.onPointerDataPacket = _handlePointerDataPacket;
platformDispatcher.onPointerDataPacket = _handlePointerDataPacket;
}
@override
......
......@@ -30,8 +30,8 @@ int _synthesiseDownButtons(int buttons, PointerDeviceKind kind) {
/// Converts from engine pointer data to framework pointer events.
///
/// This takes [PointerDataPacket] objects, as received from the engine via
/// [dart:ui.Window.onPointerDataPacket], and converts them to [PointerEvent]
/// objects.
/// [dart:ui.PlatformDispatcher.onPointerDataPacket], and converts them to
/// [PointerEvent] objects.
class PointerEventConverter {
// This class is not meant to be instantiated or extended; this constructor
// prevents instantiation and extension.
......@@ -42,7 +42,7 @@ class PointerEventConverter {
/// pointer events.
///
/// The `devicePixelRatio` argument (usually given the value from
/// [dart:ui.Window.devicePixelRatio]) is used to convert the incoming data
/// [dart:ui.FlutterView.devicePixelRatio]) is used to convert the incoming data
/// from physical coordinates to logical pixels. See the discussion at
/// [PointerEvent] for more details on the [PointerEvent] coordinate space.
static Iterable<PointerEvent> expand(Iterable<ui.PointerData> data, double devicePixelRatio) sync* {
......
......@@ -229,7 +229,8 @@ bool isSingleButton(int buttons) => buttons != 0 && (smallestButton(buttons) ==
///
/// See also:
///
/// * [Window.devicePixelRatio], which defines the device's current resolution.
/// * [dart:ui.FlutterView.devicePixelRatio], which defines the device's
/// current resolution.
/// * [Listener], a widget that calls callbacks in response to common pointer
/// events.
@immutable
......
......@@ -71,7 +71,7 @@ enum ThemeMode {
/// If a [Navigator] is created, at least one of these options must handle the
/// `/` route, since it is used when an invalid [initialRoute] is specified on
/// startup (e.g. by another application launching this one with an intent on
/// Android; see [Window.defaultRouteName]).
/// Android; see [dart:ui.PlatformDispatcher.defaultRouteName]).
///
/// This widget also configures the observer of the top-level [Navigator] (if
/// any) to perform [Hero] animations.
......
......@@ -33,7 +33,7 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
onSemanticsOwnerCreated: _handleSemanticsOwnerCreated,
onSemanticsOwnerDisposed: _handleSemanticsOwnerDisposed,
);
window
platformDispatcher
..onMetricsChanged = handleMetricsChanged
..onTextScaleFactorChanged = handleTextScaleFactorChanged
..onPlatformBrightnessChanged = handlePlatformBrightnessChanged
......@@ -187,7 +187,7 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
/// Called when the system metrics change.
///
/// See [Window.onMetricsChanged].
/// See [dart:ui.PlatformDispatcher.onMetricsChanged].
@protected
void handleMetricsChanged() {
assert(renderView != null);
......@@ -197,7 +197,7 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
/// Called when the platform text scale factor changes.
///
/// See [Window.onTextScaleFactorChanged].
/// See [dart:ui.PlatformDispatcher.onTextScaleFactorChanged].
@protected
void handleTextScaleFactorChanged() { }
......@@ -233,7 +233,7 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
/// ```
/// {@end-tool}
///
/// See [Window.onPlatformBrightnessChanged].
/// See [dart:ui.PlatformDispatcher.onPlatformBrightnessChanged].
@protected
void handlePlatformBrightnessChanged() { }
......@@ -280,7 +280,7 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
}
void _handleSemanticsEnabledChanged() {
setSemanticsEnabled(window.semanticsEnabled);
setSemanticsEnabled(platformDispatcher.semanticsEnabled);
}
/// Whether the render tree associated with this binding should produce a tree
......@@ -414,9 +414,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
/// completed this frame.
///
/// After [handleBeginFrame], [handleDrawFrame], which is registered with
/// [Window.onDrawFrame], is called, which invokes all the persistent frame
/// callbacks, of which the most notable is this method, [drawFrame], which
/// proceeds as follows:
/// [dart:ui.PlatformDispatcher.onDrawFrame], is called, which invokes all the
/// persistent frame callbacks, of which the most notable is this method,
/// [drawFrame], which proceeds as follows:
///
/// 3. The layout phase: All the dirty [RenderObject]s in the system are laid
/// out (see [RenderObject.performLayout]). See [RenderObject.markNeedsLayout]
......
......@@ -86,7 +86,7 @@ class AnnotationResult<T> {
/// To composite the tree, create a [SceneBuilder] object, pass it to the
/// root [Layer] object's [addToScene] method, and then call
/// [SceneBuilder.build] to obtain a [Scene]. A [Scene] can then be painted
/// using [Window.render].
/// using [dart:ui.FlutterView.render].
///
/// See also:
///
......@@ -1179,9 +1179,9 @@ class OffsetLayer extends ContainerLayer {
///
/// The [pixelRatio] describes the scale between the logical pixels and the
/// size of the output image. It is independent of the
/// [Window.devicePixelRatio] for the device, so specifying 1.0 (the default)
/// will give you a 1:1 mapping between logical pixels and the output pixels
/// in the image.
/// [dart:ui.FlutterView.devicePixelRatio] for the device, so specifying 1.0
/// (the default) will give you a 1:1 mapping between logical pixels and the
/// output pixels in the image.
///
/// See also:
///
......
......@@ -2914,9 +2914,9 @@ class RenderRepaintBoundary extends RenderProxyBox {
///
/// The [pixelRatio] describes the scale between the logical pixels and the
/// size of the output image. It is independent of the
/// [Window.devicePixelRatio] for the device, so specifying 1.0 (the default)
/// will give you a 1:1 mapping between logical pixels and the output pixels
/// in the image.
/// [dart:ui.FlutterView.devicePixelRatio] for the device, so specifying 1.0
/// (the default) will give you a 1:1 mapping between logical pixels and the
/// output pixels in the image.
///
/// {@tool snippet}
///
......
......@@ -4,7 +4,7 @@
import 'dart:developer';
import 'dart:io' show Platform;
import 'dart:ui' as ui show Scene, SceneBuilder, Window;
import 'dart:ui' as ui show Scene, SceneBuilder, FlutterView;
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
......@@ -57,7 +57,7 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
RenderView({
RenderBox? child,
required ViewConfiguration configuration,
required ui.Window window,
required ui.FlutterView window,
}) : assert(configuration != null),
_configuration = configuration,
_window = window {
......@@ -85,7 +85,7 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
markNeedsLayout();
}
final ui.Window _window;
final ui.FlutterView _window;
/// Whether Flutter should automatically compute the desired system UI.
///
......@@ -334,7 +334,7 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
properties.add(DiagnosticsProperty<Size>('window size', _window.physicalSize, tooltip: 'in physical pixels'));
properties.add(DoubleProperty('device pixel ratio', _window.devicePixelRatio, tooltip: 'physical pixels per logical pixel'));
properties.add(DiagnosticsProperty<ViewConfiguration>('configuration', configuration, tooltip: 'in logical pixels'));
if (_window.semanticsEnabled)
if (_window.platformDispatcher.semanticsEnabled)
properties.add(DiagnosticsNode.message('semantics enabled'));
}
}
......@@ -5,7 +5,7 @@
import 'dart:async';
import 'dart:collection';
import 'dart:developer' show Flow, Timeline;
import 'dart:ui' show AppLifecycleState, FramePhase, FrameTiming, TimingsCallback;
import 'dart:ui' show AppLifecycleState, FramePhase, FrameTiming, TimingsCallback, PlatformDispatcher;
import 'package:collection/collection.dart' show PriorityQueue, HeapPriorityQueue;
import 'package:flutter/foundation.dart';
......@@ -179,18 +179,18 @@ enum SchedulerPhase {
/// Scheduler for running the following:
///
/// * _Transient callbacks_, triggered by the system's [Window.onBeginFrame]
/// callback, for synchronizing the application's behavior to the system's
/// display. For example, [Ticker]s and [AnimationController]s trigger from
/// these.
/// * _Transient callbacks_, triggered by the system's
/// [dart:ui.PlatformDispatcher.onBeginFrame] callback, for synchronizing the
/// application's behavior to the system's display. For example, [Ticker]s and
/// [AnimationController]s trigger from these.
///
/// * _Persistent callbacks_, triggered by the system's [Window.onDrawFrame]
/// callback, for updating the system's display after transient callbacks have
/// executed. For example, the rendering layer uses this to drive its
/// rendering pipeline.
/// * _Persistent callbacks_, triggered by the system's
/// [dart:ui.PlatformDispatcher.onDrawFrame] callback, for updating the
/// system's display after transient callbacks have executed. For example, the
/// rendering layer uses this to drive its rendering pipeline.
///
/// * _Post-frame callbacks_, which are run after persistent callbacks, just
/// before returning from the [Window.onDrawFrame] callback.
/// before returning from the [dart:ui.PlatformDispatcher.onDrawFrame] callback.
///
/// * Non-rendering tasks, to be run between frames. These are given a
/// priority and are executed in priority order according to a
......@@ -238,20 +238,20 @@ mixin SchedulerBinding on BindingBase {
/// feel more sluggish.
///
/// Using [addTimingsCallback] is preferred over using
/// [Window.onReportTimings] directly because the
/// [Window.onReportTimings] API only allows one callback, which
/// prevents multiple libraries from registering listeners
/// simultaneously, while this API allows multiple callbacks to be
/// registered independently.
///
/// This API is implemented in terms of [Window.onReportTimings]. In
/// release builds, when no libraries have registered with this API,
/// the [Window.onReportTimings] callback is not set, which disables
/// the performance tracking and reduces the runtime overhead to
/// approximately zero. The performance overhead of the performance
/// tracking when one or more callbacks are registered (i.e. when it
/// is enabled) is very approximately 0.01% CPU usage per second
/// (measured on an iPhone 6s).
/// [dart:ui.PlatformDispatcher.onReportTimings] directly because the
/// [dart:ui.PlatformDispatcher.onReportTimings] API only allows one callback,
/// which prevents multiple libraries from registering listeners
/// simultaneously, while this API allows multiple callbacks to be registered
/// independently.
///
/// This API is implemented in terms of
/// [dart:ui.PlatformDispatcher.onReportTimings]. In release builds, when no
/// libraries have registered with this API, the
/// [dart:ui.PlatformDispatcher.onReportTimings] callback is not set, which
/// disables the performance tracking and reduces the runtime overhead to
/// approximately zero. The performance overhead of the performance tracking
/// when one or more callbacks are registered (i.e. when it is enabled) is
/// very approximately 0.01% CPU usage per second (measured on an iPhone 6s).
///
/// In debug and profile builds, the [SchedulerBinding] itself
/// registers a timings callback to update the [Timeline].
......@@ -265,10 +265,10 @@ mixin SchedulerBinding on BindingBase {
void addTimingsCallback(TimingsCallback callback) {
_timingsCallbacks.add(callback);
if (_timingsCallbacks.length == 1) {
assert(window.onReportTimings == null);
window.onReportTimings = _executeTimingsCallbacks;
assert(platformDispatcher.onReportTimings == null);
platformDispatcher.onReportTimings = _executeTimingsCallbacks;
}
assert(window.onReportTimings == _executeTimingsCallbacks);
assert(platformDispatcher.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) {
window.onReportTimings = null;
platformDispatcher.onReportTimings = null;
}
}
......@@ -720,12 +720,12 @@ mixin SchedulerBinding on BindingBase {
scheduleFrame();
}
/// Ensures callbacks for `window.onBeginFrame` and `window.onDrawFrame`
/// are registered.
/// Ensures callbacks for [PlatformDispatcher.onBeginFrame] and
/// [PlatformDispatcher.onDrawFrame] are registered.
@protected
void ensureFrameCallbacksRegistered() {
window.onBeginFrame ??= _handleBeginFrame;
window.onDrawFrame ??= _handleDrawFrame;
platformDispatcher.onBeginFrame ??= _handleBeginFrame;
platformDispatcher.onDrawFrame ??= _handleDrawFrame;
}
/// Schedules a new frame using [scheduleFrame] if this object is not
......@@ -755,7 +755,7 @@ mixin SchedulerBinding on BindingBase {
}
/// If necessary, schedules a new frame by calling
/// [Window.scheduleFrame].
/// [dart:ui.PlatformDispatcher.scheduleFrame].
///
/// After this is called, the engine will (eventually) call
/// [handleBeginFrame]. (This call might be delayed, e.g. if the device's
......@@ -790,11 +790,12 @@ mixin SchedulerBinding on BindingBase {
return true;
}());
ensureFrameCallbacksRegistered();
window.scheduleFrame();
platformDispatcher.scheduleFrame();
_hasScheduledFrame = true;
}
/// Schedules a new frame by calling [Window.scheduleFrame].
/// Schedules a new frame by calling
/// [dart:ui.PlatformDispatcher.scheduleFrame].
///
/// After this is called, the engine will call [handleBeginFrame], even if
/// frames would normally not be scheduled by [scheduleFrame] (e.g. even if
......@@ -826,7 +827,7 @@ mixin SchedulerBinding on BindingBase {
debugPrintStack(label: 'scheduleForcedFrame() called. Current phase is $schedulerPhase.');
return true;
}());
window.scheduleFrame();
platformDispatcher.scheduleFrame();
_hasScheduledFrame = true;
}
......@@ -934,8 +935,9 @@ mixin SchedulerBinding on BindingBase {
}
Duration? _currentFrameTimeStamp;
/// The raw time stamp as provided by the engine to [Window.onBeginFrame]
/// for the frame currently being processed.
/// The raw time stamp as provided by the engine to
/// [dart:ui.PlatformDispatcher.onBeginFrame] for the frame currently being
/// processed.
///
/// Unlike [currentFrameTimeStamp], this time stamp is neither adjusted to
/// offset when the epoch started nor scaled to reflect the [timeDilation] in
......
......@@ -21,15 +21,15 @@ mixin SemanticsBinding on BindingBase {
void initInstances() {
super.initInstances();
_instance = this;
_accessibilityFeatures = window.accessibilityFeatures;
_accessibilityFeatures = platformDispatcher.accessibilityFeatures;
}
/// Called when the platform accessibility features change.
///
/// See [Window.onAccessibilityFeaturesChanged].
/// See [dart:ui.PlatformDispatcher.onAccessibilityFeaturesChanged].
@protected
void handleAccessibilityFeaturesChanged() {
_accessibilityFeatures = window.accessibilityFeatures;
_accessibilityFeatures = platformDispatcher.accessibilityFeatures;
}
/// Creates an empty semantics update builder.
......
......@@ -2611,7 +2611,7 @@ class SemanticsOwner extends ChangeNotifier {
super.dispose();
}
/// Update the semantics using [Window.updateSemantics].
/// Update the semantics using [dart:ui.PlatformDispatcher.updateSemantics].
void sendSemanticsUpdate() {
if (_dirtyNodes.isEmpty)
return;
......@@ -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!.window.updateSemantics(builder.build());
SemanticsBinding.instance!.platformDispatcher.updateSemantics(builder.build());
notifyListeners();
}
......
......@@ -22,7 +22,7 @@ abstract class BinaryMessenger {
/// Calls the handler registered for the given channel.
///
/// Typically called by [ServicesBinding] to handle platform messages received
/// from [Window.onPlatformMessage].
/// from [dart:ui.PlatformDispatcher.onPlatformMessage].
///
/// To register a handler for a given message channel, see [setMessageHandler].
Future<void> handlePlatformMessage(String channel, ByteData? data, ui.PlatformMessageResponseCallback? callback);
......
......@@ -28,7 +28,7 @@ mixin ServicesBinding on BindingBase, SchedulerBinding {
_instance = this;
_defaultBinaryMessenger = createBinaryMessenger();
_restorationManager = createRestorationManager();
window.onPlatformMessage = defaultBinaryMessenger.handlePlatformMessage;
platformDispatcher.onPlatformMessage = defaultBinaryMessenger.handlePlatformMessage;
initLicenses();
SystemChannels.system.setMessageHandler((dynamic message) => handleSystemMessage(message as Object));
SystemChannels.lifecycle.setMessageHandler(_handleLifecycleMessage);
......@@ -166,14 +166,14 @@ mixin ServicesBinding on BindingBase, SchedulerBinding {
// App life cycle
/// Initializes the [lifecycleState] with the [Window.initialLifecycleState]
/// from the window.
/// Initializes the [lifecycleState] with the
/// [dart:ui.SingletonFlutterWindow.initialLifecycleState].
///
/// Once the [lifecycleState] is populated through any means (including this
/// method), this method will do nothing. This is because the
/// [Window.initialLifecycleState] may already be stale and it no longer makes
/// sense to use the initial state at dart vm startup as the current state
/// anymore.
/// [dart:ui.SingletonFlutterWindow.initialLifecycleState] may already be
/// stale and it no longer makes sense to use the initial state at dart vm
/// startup as the current state anymore.
///
/// The latest state should be obtained by subscribing to
/// [WidgetsBindingObserver.didChangeAppLifecycleState].
......@@ -249,13 +249,14 @@ class _DefaultBinaryMessenger extends BinaryMessenger {
Future<ByteData?> _sendPlatformMessage(String channel, ByteData? message) {
final Completer<ByteData?> completer = Completer<ByteData?>();
// ui.window is accessed directly instead of using ServicesBinding.instance.window
// because this method might be invoked before any binding is initialized.
// This issue was reported in #27541. It is not ideal to statically access
// ui.window because the Window may be dependency injected elsewhere with
// a different instance. However, static access at this location seems to be
// the least bad option.
ui.window.sendPlatformMessage(channel, message, (ByteData? reply) {
// ui.PlatformDispatcher.instance is accessed directly instead of using
// ServicesBinding.instance.platformDispatcher because this method might be
// invoked before any binding is initialized. This issue was reported in
// #27541. It is not ideal to statically access
// ui.PlatformDispatcher.instance because the PlatformDispatcher may be
// dependency injected elsewhere with a different instance. However, static
// access at this location seems to be the least bad option.
ui.PlatformDispatcher.instance.sendPlatformMessage(channel, message, (ByteData? reply) {
try {
completer.complete(reply);
} catch (exception, stack) {
......
......@@ -42,7 +42,7 @@ class BinaryMessages {
/// Calls the handler registered for the given channel.
///
/// Typically called by [ServicesBinding] to handle platform messages received
/// from [Window.onPlatformMessage].
/// from [dart:ui.PlatformDispatcher.onPlatformMessage].
///
/// To register a handler for a given message channel, see [setMessageHandler].
@Deprecated(
......
......@@ -433,8 +433,8 @@ class WidgetsApp extends StatefulWidget {
/// This object will be used by the underlying [Router].
///
/// If this is not provided, the widgets app will create a
/// [PlatformRouteInformationProvider] with initial route name equals to
/// the [Window.defaultRouteName] by default.
/// [PlatformRouteInformationProvider] with initial route name equal to the
/// [dart:ui.PlatformDispatcher.defaultRouteName] by default.
///
/// See also:
///
......@@ -525,8 +525,8 @@ class WidgetsApp extends StatefulWidget {
/// {@template flutter.widgets.widgetsApp.initialRoute}
/// The name of the first route to show, if a [Navigator] is built.
///
/// Defaults to [Window.defaultRouteName], which may be overridden by the code
/// that launched the application.
/// Defaults to [dart:ui.PlatformDispatcher.defaultRouteName], which may be
/// overridden by the code that launched the application.
///
/// If the route name starts with a slash, then it is treated as a "deep link",
/// and before this route is pushed, the routes leading to this one are pushed
......@@ -1113,15 +1113,15 @@ class _WidgetsAppState extends State<WidgetsApp> 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!.window.defaultRouteName != Navigator.defaultRouteName
? WidgetsBinding.instance!.window.defaultRouteName
: widget.initialRoute ?? WidgetsBinding.instance!.window.defaultRouteName;
String get _initialRouteName => WidgetsBinding.instance!.platformDispatcher.defaultRouteName != Navigator.defaultRouteName
? WidgetsBinding.instance!.platformDispatcher.defaultRouteName
: widget.initialRoute ?? WidgetsBinding.instance!.platformDispatcher.defaultRouteName;
@override
void initState() {
super.initState();
_updateRouting();
_locale = _resolveLocales(WidgetsBinding.instance!.window.locales, widget.supportedLocales);
_locale = _resolveLocales(WidgetsBinding.instance!.platformDispatcher.locales, widget.supportedLocales);
WidgetsBinding.instance!.addObserver(this);
}
......
......@@ -4,7 +4,7 @@
import 'dart:async';
import 'dart:developer' as developer;
import 'dart:ui' show AppLifecycleState, Locale, AccessibilityFeatures, FrameTiming, TimingsCallback;
import 'dart:ui' show AppLifecycleState, Locale, AccessibilityFeatures, FrameTiming, TimingsCallback, PlatformDispatcher;
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
......@@ -124,7 +124,8 @@ abstract class WidgetsBindingObserver {
/// Called when the application's dimensions change. For example,
/// when a phone is rotated.
///
/// This method exposes notifications from [Window.onMetricsChanged].
/// This method exposes notifications from
/// [dart:ui.PlatformDispatcher.onMetricsChanged].
///
/// {@tool snippet}
///
......@@ -185,7 +186,8 @@ abstract class WidgetsBindingObserver {
/// preferences, and it should affect all of the text sizes in the
/// application.
///
/// This method exposes notifications from [Window.onTextScaleFactorChanged].
/// This method exposes notifications from
/// [dart:ui.PlatformDispatcher.onTextScaleFactorChanged].
///
/// {@tool snippet}
///
......@@ -233,14 +235,16 @@ abstract class WidgetsBindingObserver {
/// Called when the platform brightness changes.
///
/// This method exposes notifications from [Window.onPlatformBrightnessChanged].
/// This method exposes notifications from
/// [dart:ui.PlatformDispatcher.onPlatformBrightnessChanged].
void didChangePlatformBrightness() { }
/// Called when the system tells the app that the user's locale has
/// changed. For example, if the user changes the system language
/// settings.
///
/// This method exposes notifications from [Window.onLocaleChanged].
/// This method exposes notifications from
/// [dart:ui.PlatformDispatcher.onLocaleChanged].
void didChangeLocales(List<Locale>? locale) { }
/// Called when the system puts the app in the background or returns
......@@ -261,7 +265,8 @@ abstract class WidgetsBindingObserver {
/// Called when the system changes the set of currently active accessibility
/// features.
///
/// This method exposes notifications from [Window.onAccessibilityFeaturesChanged].
/// This method exposes notifications from
/// [dart:ui.PlatformDispatcher.onAccessibilityFeaturesChanged].
void didChangeAccessibilityFeatures() { }
}
......@@ -282,8 +287,8 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB
// properly setup the [defaultBinaryMessenger] instance.
_buildOwner = BuildOwner();
buildOwner!.onBuildScheduled = _handleBuildScheduled;
window.onLocaleChanged = handleLocaleChanged;
window.onAccessibilityFeaturesChanged = handleAccessibilityFeaturesChanged;
platformDispatcher.onLocaleChanged = handleLocaleChanged;
platformDispatcher.onAccessibilityFeaturesChanged = handleAccessibilityFeaturesChanged;
SystemChannels.navigation.setMethodCallHandler(_handleNavigationInvocation);
FlutterErrorDetails.propertiesTransformers.add(transformDebugCreator);
}
......@@ -577,19 +582,19 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB
///
/// Calls [dispatchLocalesChanged] to notify the binding observers.
///
/// See [Window.onLocaleChanged].
/// See [dart:ui.PlatformDispatcher.onLocaleChanged].
@protected
@mustCallSuper
void handleLocaleChanged() {
dispatchLocalesChanged(window.locales);
dispatchLocalesChanged(platformDispatcher.locales);
}
/// Notify all the observers that the locale has changed (using
/// [WidgetsBindingObserver.didChangeLocales]), giving them the
/// `locales` argument.
///
/// This is called by [handleLocaleChanged] when the [Window.onLocaleChanged]
/// notification is received.
/// This is called by [handleLocaleChanged] when the
/// [PlatformDispatcher.onLocaleChanged] notification is received.
@protected
@mustCallSuper
void dispatchLocalesChanged(List<Locale>? locales) {
......@@ -602,7 +607,7 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB
/// giving them the `features` argument.
///
/// This is called by [handleAccessibilityFeaturesChanged] when the
/// [Window.onAccessibilityFeaturesChanged] notification is received.
/// [PlatformDispatcher.onAccessibilityFeaturesChanged] notification is received.
@protected
@mustCallSuper
void dispatchAccessibilityFeaturesChanged() {
......@@ -806,11 +811,11 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB
/// Each frame consists of the following phases:
///
/// 1. The animation phase: The [handleBeginFrame] method, which is registered
/// with [Window.onBeginFrame], invokes all the transient frame callbacks
/// registered with [scheduleFrameCallback], in
/// registration order. This includes all the [Ticker] instances that are
/// driving [AnimationController] objects, which means all of the active
/// [Animation] objects tick at this point.
/// with [PlatformDispatcher.onBeginFrame], invokes all the transient frame
/// callbacks registered with [scheduleFrameCallback], in registration order.
/// This includes all the [Ticker] instances that are driving
/// [AnimationController] objects, which means all of the active [Animation]
/// objects tick at this point.
///
/// 2. Microtasks: After [handleBeginFrame] returns, any microtasks that got
/// scheduled by transient frame callbacks get to run. This typically includes
......@@ -818,9 +823,9 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB
/// completed this frame.
///
/// After [handleBeginFrame], [handleDrawFrame], which is registered with
/// [Window.onDrawFrame], is called, which invokes all the persistent frame
/// callbacks, of which the most notable is this method, [drawFrame], which
/// proceeds as follows:
/// [PlatformDispatcher.onDrawFrame], is called, which invokes all the
/// persistent frame callbacks, of which the most notable is this method,
/// [drawFrame], which proceeds as follows:
///
/// 3. The build phase: All the dirty [Element]s in the widget tree are
/// rebuilt (see [State.build]). See [State.setState] for further details on
......@@ -883,9 +888,9 @@ mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureB
firstFrameCallback = null;
_firstFrameCompleter.complete();
};
// Callback is only invoked when [Window.render] is called. When
// [sendFramesToEngine] is set to false during the frame, it will not
// be called and we need to remove the callback (see below).
// Callback is only invoked when FlutterView.render is called. When
// sendFramesToEngine is set to false during the frame, it will not be
// called and we need to remove the callback (see below).
SchedulerBinding.instance!.addTimingsCallback(firstFrameCallback!);
}
......@@ -1011,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<Locale> supportedLocales) {
return window.computePlatformResolvedLocale(supportedLocales);
return platformDispatcher.computePlatformResolvedLocale(supportedLocales);
}
}
......
......@@ -86,7 +86,7 @@ class MediaQueryData {
/// Creates data for a media query with explicit values.
///
/// Consider using [MediaQueryData.fromWindow] to create data based on a
/// [Window].
/// [dart:ui.PlatformDispatcher].
const MediaQueryData({
this.size = Size.zero,
this.devicePixelRatio = 1.0,
......@@ -124,8 +124,9 @@ class MediaQueryData {
/// If you use this, you should ensure that you also register for
/// notifications so that you can update your [MediaQueryData] when the
/// window's metrics change. For example, see
/// [WidgetsBindingObserver.didChangeMetrics] or [Window.onMetricsChanged].
MediaQueryData.fromWindow(ui.Window window)
/// [WidgetsBindingObserver.didChangeMetrics] or
/// [dart:ui.PlatformDispatcher.onMetricsChanged].
MediaQueryData.fromWindow(ui.SingletonFlutterWindow window)
: size = window.physicalSize / window.devicePixelRatio,
devicePixelRatio = window.devicePixelRatio,
textScaleFactor = window.textScaleFactor,
......@@ -308,7 +309,7 @@ class MediaQueryData {
///
/// See also:
///
/// * [Window.accessibilityFeatures], where the setting originates.
/// * [dart:ui.PlatformDispatcher.accessibilityFeatures], where the setting originates.
final bool accessibleNavigation;
/// Whether the device is inverting the colors of the platform.
......@@ -317,7 +318,8 @@ class MediaQueryData {
///
/// See also:
///
/// * [Window.accessibilityFeatures], where the setting originates.
/// * [dart:ui.PlatformDispatcher.accessibilityFeatures], where the setting
/// originates.
final bool invertColors;
/// Whether the user requested a high contrast between foreground and background
......@@ -332,7 +334,8 @@ class MediaQueryData {
///
/// See also:
///
/// * [Window.accessibilityFeatures], where the setting originates.
/// * [dart:ui.PlatformDispatcher.accessibilityFeatures], where the setting
/// originates.
final bool disableAnimations;
/// Whether the platform is requesting that text be drawn with a bold font
......@@ -340,7 +343,8 @@ class MediaQueryData {
///
/// See also:
///
/// * [Window.accessibilityFeatures], where the setting originates.
/// * [dart:ui.PlatformDispatcher.accessibilityFeatures], where the setting
/// originates.
final bool boldText;
/// Describes the navigation mode requested by the platform.
......
......@@ -1563,7 +1563,7 @@ class Navigator extends StatefulWidget {
///
/// See also:
///
/// * [dart:ui.Window.defaultRouteName], which reflects the route that the
/// * [dart:ui.PlatformDispatcher.defaultRouteName], which reflects the route that the
/// application was started with.
static const String defaultRouteName = '/';
......
......@@ -31,7 +31,7 @@ import 'media_query.dart';
/// intrusions.
/// * [Padding], for insetting widgets in general.
/// * [MediaQuery], from which the window padding is obtained.
/// * [dart:ui.Window.padding], which reports the padding from the operating
/// * [dart:ui.FlutterView.padding], which reports the padding from the operating
/// system.
class SafeArea extends StatelessWidget {
/// Creates a widget that avoids operating system interfaces.
......@@ -147,7 +147,7 @@ class SafeArea extends StatelessWidget {
/// * [SafeArea], for insetting widgets to avoid operating system intrusions.
/// * [SliverPadding], for insetting slivers in general.
/// * [MediaQuery], from which the window padding is obtained.
/// * [dart:ui.Window.padding], which reports the padding from the operating
/// * [dart:ui.FlutterView.padding], which reports the padding from the operating
/// system.
class SliverSafeArea extends StatelessWidget {
/// Creates a sliver that avoids operating system interfaces.
......
......@@ -87,7 +87,10 @@ class TestBindingBase implements BindingBase {
void unlocked() {}
@override
ui.Window get window => throw UnimplementedError();
ui.SingletonFlutterWindow get window => throw UnimplementedError();
@override
ui.PlatformDispatcher get platformDispatcher => throw UnimplementedError();
}
class TestPaintingBinding extends TestBindingBase with SchedulerBinding, ServicesBinding, PaintingBinding {
......
......@@ -71,7 +71,10 @@ class TestBindingBase implements BindingBase {
void unlocked() {}
@override
ui.Window get window => TestWindow(window: ui.window);
ui.SingletonFlutterWindow get window => TestWindow(window: ui.window);
@override
ui.PlatformDispatcher get platformDispatcher => TestWindow(window: ui.window).platformDispatcher;
}
class TestPaintingBinding extends TestBindingBase with SchedulerBinding, ServicesBinding, PaintingBinding {}
......@@ -19,14 +19,14 @@ void main() {
// Simulates the engine completing a frame render to trigger the
// appropriate callback setting [WidgetBinding.firstFrameRasterized].
binding.window.onReportTimings!(<FrameTiming>[]);
binding.platformDispatcher.onReportTimings!(<FrameTiming>[]);
expect(binding.firstFrameRasterized, isFalse);
binding.allowFirstFrame();
fakeAsync.flushTimers();
// Simulates the engine again.
binding.window.onReportTimings!(<FrameTiming>[]);
binding.platformDispatcher.onReportTimings!(<FrameTiming>[]);
expect(binding.firstFrameRasterized, isTrue);
});
});
......
......@@ -98,7 +98,8 @@ class TestSemantics {
/// set to the appropriate values for direct children of the root node.
///
/// The [transform] is set to a 3.0 scale (to account for the
/// [Window.devicePixelRatio] being 3.0 on the test pseudo-device).
/// [dart:ui.FlutterView.devicePixelRatio] being 3.0 on the test
/// pseudo-device).
///
/// The [rect] field is required and has no default. The
/// [TestSemantics.fullScreen] property may be useful as a value; it describes
......
......@@ -31,7 +31,7 @@ EnumIndex<OffsetType> _offsetTypeIndex = EnumIndex<OffsetType>(OffsetType.values
/// identified by [finder].
///
/// The requested offset is returned in logical pixels, which can be translated
/// to device pixels via [Window.devicePixelRatio].
/// to device pixels via [dart:ui.FlutterView.devicePixelRatio].
class GetOffset extends CommandWithTarget {
/// The `finder` looks for an element to get its rect.
GetOffset(SerializableFinder finder, this.offsetType, { Duration? timeout }) : super(finder, timeout: timeout);
......@@ -56,7 +56,7 @@ class GetOffset extends CommandWithTarget {
/// The result of the [GetOffset] command.
///
/// The offset is provided in logical pixels, which can be translated
/// to device pixels via [Window.devicePixelRatio].
/// to device pixels via [dart:ui.FlutterView.devicePixelRatio].
class GetOffsetResult extends Result {
/// Creates a result with the offset defined by [dx] and [dy].
const GetOffsetResult({ this.dx = 0.0, this.dy = 0.0});
......@@ -64,13 +64,13 @@ class GetOffsetResult extends Result {
/// The x component of the offset in logical pixels.
///
/// The value can be translated to device pixels via
/// [Window.devicePixelRatio].
/// [dart:ui.FlutterView.devicePixelRatio].
final double dx;
/// The y component of the offset in logical pixels.
///
/// The value can be translated to device pixels via
/// [Window.devicePixelRatio].
/// [dart:ui.FlutterView.devicePixelRatio].
final double dy;
/// Deserializes the result from JSON.
......
......@@ -227,7 +227,8 @@ abstract class FlutterDriver {
await sendCommand(WaitForCondition(const NoTransientCallbacks(), timeout: timeout));
}
/// Waits until the next [Window.onReportTimings] is called.
/// Waits until the next [dart:ui.PlatformDispatcher.onReportTimings] is
/// called.
///
/// Use this method to wait for the first frame to be rasterized during the
/// app launch.
......@@ -246,7 +247,7 @@ abstract class FlutterDriver {
/// Returns the point at the top left of the widget identified by `finder`.
///
/// The offset is expressed in logical pixels and can be translated to
/// device pixels via [Window.devicePixelRatio].
/// device pixels via [dart:ui.FlutterView.devicePixelRatio].
Future<DriverOffset> getTopLeft(SerializableFinder finder, { Duration timeout }) async {
return _getOffset(finder, OffsetType.topLeft, timeout: timeout);
}
......@@ -254,7 +255,7 @@ abstract class FlutterDriver {
/// Returns the point at the top right of the widget identified by `finder`.
///
/// The offset is expressed in logical pixels and can be translated to
/// device pixels via [Window.devicePixelRatio].
/// device pixels via [dart:ui.FlutterView.devicePixelRatio].
Future<DriverOffset> getTopRight(SerializableFinder finder, { Duration timeout }) async {
return _getOffset(finder, OffsetType.topRight, timeout: timeout);
}
......@@ -262,7 +263,7 @@ abstract class FlutterDriver {
/// Returns the point at the bottom left of the widget identified by `finder`.
///
/// The offset is expressed in logical pixels and can be translated to
/// device pixels via [Window.devicePixelRatio].
/// device pixels via [dart:ui.FlutterView.devicePixelRatio].
Future<DriverOffset> getBottomLeft(SerializableFinder finder, { Duration timeout }) async {
return _getOffset(finder, OffsetType.bottomLeft, timeout: timeout);
}
......@@ -270,7 +271,7 @@ abstract class FlutterDriver {
/// Returns the point at the bottom right of the widget identified by `finder`.
///
/// The offset is expressed in logical pixels and can be translated to
/// device pixels via [Window.devicePixelRatio].
/// device pixels via [dart:ui.FlutterView.devicePixelRatio].
Future<DriverOffset> getBottomRight(SerializableFinder finder, { Duration timeout }) async {
return _getOffset(finder, OffsetType.bottomRight, timeout: timeout);
}
......@@ -278,7 +279,7 @@ abstract class FlutterDriver {
/// Returns the point at the center of the widget identified by `finder`.
///
/// The offset is expressed in logical pixels and can be translated to
/// device pixels via [Window.devicePixelRatio].
/// device pixels via [dart:ui.FlutterView.devicePixelRatio].
Future<DriverOffset> getCenter(SerializableFinder finder, { Duration timeout }) async {
return _getOffset(finder, OffsetType.center, timeout: timeout);
}
......
......@@ -88,7 +88,7 @@ RenderObject _findRepaintBoundary(Element element) {
return renderObject;
}
void _renderElement(ui.Window window, RenderObject renderObject) {
void _renderElement(ui.FlutterView window, RenderObject renderObject) {
assert(renderObject.debugLayer != null);
final Layer layer = renderObject.debugLayer!;
final ui.SceneBuilder sceneBuilder = ui.SceneBuilder();
......
......@@ -311,7 +311,7 @@ class MinimumTextContrastGuideline extends AccessibilityGuideline {
// Given a pixel buffer based on the physical window size, can we actually
// get all the data from this node? allow a small delta overlap before
// culling the node.
bool _isNodeOffScreen(Rect paintBounds, ui.Window window) {
bool _isNodeOffScreen(Rect paintBounds, ui.FlutterView window) {
return paintBounds.top < -50.0
|| paintBounds.left < -50.0
|| paintBounds.bottom > (window.physicalSize.height * window.devicePixelRatio) + 50.0
......
......@@ -1038,9 +1038,9 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding {
@override
void ensureFrameCallbacksRegistered() {
// Leave Window alone, do nothing.
assert(window.onDrawFrame == null);
assert(window.onBeginFrame == null);
// Leave PlatformDispatcher alone, do nothing.
assert(platformDispatcher.onDrawFrame == null);
assert(platformDispatcher.onBeginFrame == null);
}
@override
......@@ -1326,7 +1326,7 @@ enum LiveTestWidgetsFlutterBindingFramePolicy {
/// pipeline directly. It tells the binding to entirely ignore requests for a
/// frame to be scheduled, while still allowing frames that are pumped
/// directly to run (either by using [WidgetTester.pumpBenchmark] or invoking
/// [Window.onBeginFrame] and [Window.onDrawFrame]).
/// [PlatformDispatcher.onBeginFrame] and [PlatformDispatcher.onDrawFrame]).
///
/// This allows all frame requests from the engine to be serviced, and allows
/// all frame requests that are artificially triggered to be serviced, but
......@@ -1684,17 +1684,17 @@ class TestViewConfiguration extends ViewConfiguration {
/// If a [window] instance is not provided it defaults to [ui.window].
factory TestViewConfiguration({
Size size = _kDefaultTestViewportSize,
ui.Window? window,
ui.FlutterView? window,
}) {
return TestViewConfiguration._(size, window ?? ui.window);
}
TestViewConfiguration._(Size size, ui.Window window)
TestViewConfiguration._(Size size, ui.FlutterView window)
: _paintMatrix = _getMatrix(size, window.devicePixelRatio, window),
_hitTestMatrix = _getMatrix(size, 1.0, window),
super(size: size);
static Matrix4 _getMatrix(Size size, double devicePixelRatio, ui.Window window) {
static Matrix4 _getMatrix(Size size, double devicePixelRatio, ui.FlutterView window) {
final double inverseRatio = devicePixelRatio / window.devicePixelRatio;
final double actualWidth = window.physicalSize.width * inverseRatio;
final double actualHeight = window.physicalSize.height * inverseRatio;
......@@ -1756,7 +1756,7 @@ class _LiveTestRenderView extends RenderView {
_LiveTestRenderView({
required ViewConfiguration configuration,
required this.onNeedPaint,
required ui.Window window,
required ui.FlutterView window,
}) : super(configuration: configuration, window: window);
@override
......
This diff is collapsed.
......@@ -1100,7 +1100,7 @@ void handleSymlinkException(FileSystemException e, {
if (platform.isWindows && (e.osError?.errorCode ?? 0) == 1314) {
final String versionString = RegExp(r'[\d.]+').firstMatch(os.name)?.group(0);
final Version version = Version.parse(versionString);
// Window 10 14972 is the oldest version that allows creating symlinks
// Windows 10 14972 is the oldest version that allows creating symlinks
// just by enabling developer mode; before that it requires running the
// terminal as Administrator.
// https://blogs.windows.com/windowsdeveloper/2016/12/02/symlinks-windows-10/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment